调用方法作为闭包

时间:2009-09-08 17:16:51

标签: groovy closures

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

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)}

它工作正常,但我对.&运算符的理解有什么问题?

谢谢, 唐

3 个答案:

答案 0 :(得分:8)

使用。& 表示法将方法转换为闭包时,请省略参数。 f。&方法(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

正如您所指出的,以下内容将起作用:

invokeClosure {f.method(6)}

那是因为你传递的是一个不带参数的闭包,这就是为什么closure.call()在这种情况下有效。

答案 1 :(得分:1)

请改用invokeClosure f.&method.curry(6)。这是一个可以不带参数调用的闭包

答案 2 :(得分:0)

上面的示例也可以扩展为将参数作为参数引入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