2
一個類實現了call
方法,以便它的對象可以作爲方法調用。這適用於大多數情況,但不適用於在一個類的實例變量對象的閉包內進行調用的情況。Groovy:隱式調用不在閉包內的實例變量上
爲了演示這個問題,在下面的代碼中,我用數字評論了有趣的幾行。雖然大多數變體都會產生相同的輸出,但只有帶註釋5
的行不起作用。它引發groovy.lang.MissingMethodException: No signature of method: Client2.instanceVar() is applicable for argument types:() values: []
)
有人可以幫我理解原因嗎?這是一個錯誤嗎?
class CallableObject {
def call() { println "hello" }
}
class Client {
def instanceVar = new CallableObject()
def method() {
def localVar = new CallableObject()
def closure1 = { localVar() }
def closure2 = { instanceVar.call() }
def closure3 = { instanceVar() } // doesn't work
localVar() // 1
instanceVar() // 2
closure1() // 3
closure2() // 4
closure3() // 5
}
}
new Client().method()
儘管這會讓DSL的用戶感到意外,但我猜想沒有其他辦法:) – kunal