5

我创建了一个代码示例,显示了我遇到的问题:

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为适当的静态方法(不是闭包)来使其工作,但这不适用于我的情况,因为我实际上需要为 printit 提供一些仅在方法范围内可用的数据(不包括在这个例子,因为我的问题与绑定本身有关)。

4

1 回答 1

2

至于为什么会这样,很遗憾,我无法给出明确的答案。有一些关于隐式-“this”注释等的讨论。它似乎应该起作用,但是对于应该首先尝试什么(this-scope或delegate)有些模糊。

目前存在的问题似乎是正确的。我发现了以下其他同意的资源,并进行了一些讨论,但没有解决原因。

关于这个问题的 Nabble 讨论:http: //groovy.329449.n5.nabble.com/Binding-Closure-property-not-called-as-method-td5562137.html

JIRA 票证结果: https ://issues.apache.org/jira/browse/GROOVY-5367

于 2013-03-12T18:04:59.667 回答