解释这个Groovy代码?

解释这个Groovy代码?,groovy,Groovy,我相信它返回的是您传入的值的两倍,或者如果您给它一个字符串,则返回两次相同字符串的串联。代码定义了一个返回闭包的函数/方法foo。为了理解这段代码,您可以将闭包看作是一个没有名称且未附加到任何对象的方法 可以通过向闭包传递单个参数来调用闭包。闭包返回的值将是n+=it,其中it是用于引用闭包参数的默认名称。如果希望闭包的参数具有不同的名称,例如,closureParam,则需要明确定义它: def foo(n) { return {n += it} } ->将闭包的参数列表与闭包主体分

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

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

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

def foo(n) {
    return {n += it}
}
->
将闭包的参数列表与闭包主体分开。如果未定义参数列表,则默认为名为
it
的单个参数。调用闭包的示例可能会有所帮助:

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

question.getContext()
-NullPointerException。。。它看起来像一个闭包,但我们可能需要更多的上下文。实现这一点的更好方法(IMHO)是使用
curry
——请看您描述的闭包将是
{It*2}
好的闭包。不过看起来是一个令人困惑的结尾。咖喱似乎是一个更好的选择。雅雅咖喱是一个非常强大的处理函数的方法:)答案是缺少一个重要方面。返回的闭包是一个累加器。n是两次调用之间保持的状态。所以foo(3)将产生一个以n=3开始的闭包。调用闭包(5)不仅返回8,还将n设置为8。因此,再次关闭(5)将导致13。我认为你不能用咖喱来做这件事
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)