我对Groovy运算符的理解.&是它将方法调用转换为闭包.因此,似乎以下代码(可以在Groovy控制台中运行)应该工作:
class Foo {
def method(def param) {
param + 10
}
}
def invokeClosure = {Closure closure ->
return closure.call()
}
def f = new Foo()
invokeClosure f.&method(6)
Run Code Online (Sandbox Code Playgroud)
当然,如果我将最后一行更改为
invokeClosure {f.method(6)}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我对.&操作员的理解有什么问题?
谢谢,唐
使用.& notation 将方法转换为闭包时,请省略参数.f.&method(6)与调用返回16的f.method(6)相同,所以在你的例子中你将16传递给invokeClosure而不是闭包.由于Integer类没有调用方法,因此导致以下异常:
抛出异常:没有方法签名:java.lang.Integer.call()
下面将f.method的方法指针传递给invokeClosure,这将是你通常使用的方式.&.
class Foo {
def method(def param) {
param + 10
}
}
def invokeClosure = {Closure closure ->
return closure.call(6) // can leave off .call
}
def f = new Foo()
invokeClosure f.&method
Run Code Online (Sandbox Code Playgroud)
正如您所指出的,以下内容将起作用:
invokeClosure {f.method(6)}
Run Code Online (Sandbox Code Playgroud)
那是因为你传递的是一个不带参数的闭包,这就是为什么closure.call()在这种情况下有效的原因.
| 归档时间: |
|
| 查看次数: |
4431 次 |
| 最近记录: |