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
- 1. 解釋這個C++代碼
- 2. 解釋這個代碼
- 3. 解釋這個代碼
- 4. 這行代碼的解釋?
- 5. 請解釋這些代碼
- 6. 請解釋這段代碼
- 7. 解釋這行代碼
- 8. 這段代碼的解釋?
- 9. 的Javascript解釋這個代碼,請
- 10. 有人可以解釋這個代碼
- 11. 解釋這個C代碼請
- 12. 請解釋這個Ruby代碼(在軌)
- 13. 解釋什麼是這個代碼
- 14. 如何解釋這個C++代碼?
- 15. 請解釋這個java代碼
- 16. 這個C++代碼解釋了什麼
- 17. 請解釋這個java代碼?
- 18. 解釋代碼
- 19. 解釋代碼
- 20. 代碼解釋
- 21. 代碼解釋
- 22. 解釋代碼
- 23. 解釋代碼
- 24. 這個Groovy代碼是做什麼的?
- 25. 如何並行化這個groovy代碼?
- 26. 這個groovy代碼有什麼不對?
- 27. 解釋這些LINQ的代碼
- 28. 解釋這行代碼的Android
- 29. 請解釋這段代碼的工作?
- 30. 解釋這行代碼在斯卡拉
'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