Groovy 将方法作为闭包调用

Groovy 将方法作为闭包调用,groovy,closures,Groovy,Closures,我对Groovy操作符&的理解是,它将方法调用转换为闭包。因此,以下代码(可以在中运行)似乎应该可以工作: class Foo { def method(def param) { param + 10 } } def invokeClosure = {Closure closure -> return closure.call() } def f = new Foo() invokeClosure f.&method(6) 当然,如果我把最后一行改为 i

我对Groovy操作符
&
的理解是,它将方法调用转换为闭包。因此,以下代码(可以在中运行)似乎应该可以工作:

class Foo {
  def method(def param) {
    param + 10
  }
}

def invokeClosure = {Closure closure ->
   return closure.call()
}

def f = new Foo()
invokeClosure f.&method(6)
当然,如果我把最后一行改为

invokeClosure {f.method(6)}
它工作正常,但是我对
&
操作符的理解有什么问题

谢谢,
Don

当使用&符号将方法转换为闭包时,您可以省略参数。f、 &method(6)与调用f.method(6)相同,f.method(6)将返回16,因此在您的示例中,您将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
正如你所指出的,以下措施将起作用:

invokeClosure {f.method(6)}

这是因为您传递的闭包不带任何参数,所以闭包.call()在这种情况下工作。

使用
invokeClosure f.&method.curry(6)
。这是一个可以在没有参数的情况下调用的闭包

上面的示例也可以扩展为将参数作为参数引入invokeClosure。这将为您提供预期的结果和语法

class Foo {
  def method(def param) {
    param + 10
  }
}

def invokeClosure = {Closure closure, def parameter ->
   return closure.call(parameter) 
}

def f = new Foo()
invokeClosure f.&method, 6

实际上,严格地说,我认为
{f.method(6)}
是一个只接受一个参数的闭包,而
{->f.method(6)}
是一个不接受任何参数的闭包。回答得很好,谢谢!