我创建了一个代码示例,显示了我遇到的问题:
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
,documentation表示实现了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
定义为适当的静态方法(而不是闭包)来使其工作,但这对我的情况不起作用,因为我实际上需要给printit提供一些仅在方法内部可用的数据范围(由于我的问题与绑定本身有关,因此未包含在示例中)。
答案 0 :(得分:2)
至于为什么会这样,遗憾的是我无法给出明确的答案。有一些关于隐式 - “这个”注释等的讨论,似乎它应该有效,但是对于应该首先尝试的内容(这个范围或代理)有一些模糊性。
目前,这个问题似乎是正确的。我发现以下其他资源都是一致的,有些讨论没有解决原因。
关于这个问题的讨论: http://groovy.329449.n5.nabble.com/Binding-Closure-property-not-called-as-method-td5562137.html