2011-03-29 25 views

回答

9

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的

+5

其實,它在'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

+0

@tim_yates謝謝,但我更喜歡我的實現:) – 2011-03-29 18:25:01

+0

呵呵,太享受你的幻想世界了是嗎? ;-) – 2011-03-29 18:30:51

2

使用每個閉包時的空值與具有0個元素的集合相同。如果您的代碼是

def test=null 
test.each {println "In closure with value "+it} 

print語句不會執行。如果您將測試更改爲

def test=[1,2,3] 

您將獲得輸出。

相關問題