2011-03-03 133 views
2
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

回答

17

該代碼定義了一個返回閉包的函數/方法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

-2

我相信它會返回您傳入的值的兩倍,或者如果您給它一個字符串,則會將同一個字符串串聯兩次。

+4

你已經描述過的關閉會是'{it * 2}' – 2011-03-03 21:16:01