回答
each
的執行嘗試以無效安全方式調用它的目標的iterator
方法。如果在空對象或沒有iterator
方法的對象上調用each
,則不會發生任何情況。
我還沒有看到源代碼,但它可能看起來像this§
Object each(Closure closure) {
if (this?.respondsTo("iterator")) {
def iterator = this.iterator()
while (iterator.hasNext() {
def item = iterator.next()
closure(item)
}
}
return this
}
§在現實中,這種方法可能是用Java編寫的,而不是Groovy的
其實,它在'org.codehaus .groovy.runtime.NullObject.java',其中有一個方法定義爲'public Iterator iterator(){return Collections.EMPTY_LIST.iterator(); }'所以'NullObject'('null')在被'each'查詢時返回一個'Iterator'到一個空的'List'。 – 2011-03-29 13:54:25
@tim_yates謝謝,但我更喜歡我的實現:) – 2011-03-29 18:25:01
呵呵,太享受你的幻想世界了是嗎? ;-) – 2011-03-29 18:30:51
使用每個閉包時的空值與具有0個元素的集合相同。如果您的代碼是
def test=null
test.each {println "In closure with value "+it}
print語句不會執行。如果您將測試更改爲
def test=[1,2,3]
您將獲得輸出。
- 1. 在這種情況下,爲什麼我會得到Unreachable Code?
- 2. 爲什麼在這種情況下我得到零錯誤?
- 3. 爲什麼在這三種情況下
- 4. 爲什麼在這種情況下
- 5. 爲什麼在這種情況下
- 6. 爲什麼在這種情況下,respondsToSelector不適用於我?
- 7. 爲什麼QWebFrame :: evalutateJavaScript在這種情況下什麼都不做?
- 8. Groovy:什麼是「?」意味着在這種情況下?
- 9. 「:」在這種情況下做什麼?
- 10. sched_yield在這種情況下做什麼?
- 11. 有什麼用在這種情況下
- 12. 什麼是在這種情況下
- 13. *在這種情況下做什麼?:
- 14. .map()在這種情況下做什麼?
- 15. 什麼是在這種情況下
- 16. 什麼在這種情況下
- 17. 我怎麼能在這種情況下
- 18. 我怎麼能在這種情況下
- 19. 爲什麼underscore.reduce在這兩種情況下的行爲不同?
- 20. 似乎Groovy在這兩種情況下行爲不同?
- 21. 爲什麼我需要在這種情況下演員陣容?
- 22. 爲什麼在這種情況下我有IOException?
- 23. 爲什麼我收到ClassCastException異常在這種情況下
- 24. 爲什麼我需要在這種情況下施放?
- 25. 爲什麼我在這種情況下打印出System.char []?
- 26. 爲什麼insertBefore,在這種情況下,刪除我的元素?
- 27. 在Pandas中,爲什麼groupby'key'列在這種情況下消失
- 28. 什麼是wrapper_descriptor,在這種情況下爲什麼是Foo .__ init __()?
- 29. 我在這兩種情況下做了什麼不同?
- 30. 爲什麼不在這種情況下調試工作?
這裏相關questiuon:HTTP ://stackoverflow.com/questions/2480195/what-is-the-purpose-of-the-nullobject-class-in-groovy – 2011-03-29 13:56:28
@tim_yates感謝相關問題的鏈接 – res1 2011-04-01 09:21:13