解释这个Groovy代码?
def foo(n) {
return {n += it}
}
该代码定义了一个返回闭包的函数/方法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很好解释 – 2011-03-03 18:00:22
+1很好的解释:) – 2011-03-04 04:24:40
不错的一个。看起来像一个令人困惑的封闭,但。咖喱似乎是一个更好的选择。 – Steven 2011-03-05 03:38:30
我相信它会返回您传入的值的两倍,或者如果您给它一个字符串,则会将同一个字符串串联两次。
你已经描述过的关闭会是'{it * 2}' – 2011-03-03 21:16:01
'question.getContext()' - NullPointerException异常......它看起来像一个封闭的,但我们可能需要更多的上下文。 – corsiKa 2011-03-03 17:31:07
更好的方式(恕我直言)实现相同的将通过使用'咖喱' - 见http://mrhaki.blogspot.com/2010/04/groovy-goodness-new-ways-to-curry.html – 2011-03-03 17:49:48