私が抱えている問題を示すコードサンプルを作成しました:
class BindingExample {
public static void main(String[] args) {
Closure closure1 = {
printit.call("Hello from closure 1")
}
Closure closure2 = {
printit("Hello from closure 2")
}
Closure printit = { s ->
println("printing: "+s)
}
Binding binding = new Binding()
binding.setVariable("printit", printit)
closure1.delegate = binding
closure2.delegate = binding
closure1() //This works fine
closure2() //This does not.
//Why does .call() work and () alone not? Most documentation says they're the same.
}
}
PrintitはClosure
、ドキュメントがdoCallを実装していることを示しているため、()を介して短い形式で呼び出すことができます。
ただし、デリゲートへのバインドを介してこのクロージャが使用可能になると、長い形式の呼び出しのみが許可されます。出力は次のとおりです。
printing: Hello from closure 1
Exception in thread "main" groovy.lang.MissingMethodException: No signature of method: groovy.lang.Binding.printit() is applicable for argument types: (java.lang.String) values: [Hello from closure 2]
誰かがこれが事実である理由を説明できますか?可能であれば、短い形式のバージョンが機能するようにする方法も確認したいと思います。printit
適切な静的メソッド(クロージャーではない)として定義することで機能させることができましたが、実際にはメソッドスコープ内でのみ利用可能なデータ(私の質問はバインディング自体に関連しているので、例)。