解释这个Groovy代码?

问题描述:

def foo(n) { 
    return {n += it} 
} 
+2

'question.getContext()' - NullPointerException异常......它看起来像一个封闭的,但我们可能需要更多的上下文。 – corsiKa 2011-03-03 17:31:07

+0

更好的方式(恕我直言)实现相同的将通过使用'咖喱' - 见http://mrhaki.blogspot.com/2010/04/groovy-goodness-new-ways-to-curry.html – 2011-03-03 17:49:48

该代码定义了一个返回闭包的函数/方法foo。为了理解这段代码,你可以将闭包看作一个没有名字并且没有附加到任何对象的方法。

闭包可以通过传递一个参数来调用。封闭返回的值将是n += it,其中it是用于引用闭包参数的默认名称。如果您希望封闭式的论点具有不同的名称,例如closureParam你需要明确地定义它:

def foo(n) { 
    return {closureParam -> n += closureParam} 
} 

->封闭的参数列表从封闭体分离。如果未定义参数列表,则默认为名为it的单个参数。也许调用关闭的例子将帮助:

Closure closure = foo(2) 
def closureReturnVal = closure.call(4) 
assert closureReturnVal == 6 // because 4 + 2 == 6 

// you can omit .call when calling a closure, so the following also works 
closure = foo(3) 
assert 8 == closure(5) 
+1

+1很好解释 – 2011-03-03 18:00:22

+0

+1很好的解释:) – 2011-03-04 04:24:40

+0

不错的一个。看起来像一个令人困惑的封闭,但。咖喱似乎是一个更好的选择。 – Steven 2011-03-05 03:38:30

我相信它会返回您传入的值的两倍,或者如果您给它一个字符串,则会将同一个字符串串联两次。

+4

你已经描述过的关闭会是'{it * 2}' – 2011-03-03 21:16:01