2011-03-29 15 views

Respuesta

9

La implementación de each trata de llamar al método iterator de su blanco de una manera segura nulo. Si se llama a each en un objeto nulo, o un objeto sin un método iterator, no ocurre nada.

No he visto el código fuente, pero podría ser algo como this§

Object each(Closure closure) { 

    if (this?.respondsTo("iterator")) { 

    def iterator = this.iterator() 

    while (iterator.hasNext() { 
     def item = iterator.next() 
     closure(item) 
    } 
    } 
    return this 
} 

§ En realidad, este método es probablemente escrito en Java en lugar de maravilloso

+5

En realidad, está en 'org.codehaus .groovy.runtime.NullObject.java', donde hay un método definido como 'public Iterator iterator() {return Collections.EMPTY_LIST.iterator(); } 'Así que el' NullObject' ('null') devuelve un' Iterator' a una 'Lista' vacía cuando es consultado por' each' –

+0

@tim_yates gracias, pero prefiero mi implementación :) –

+0

Hehe, disfrutando demasiado de tu mundo de fantasía ¿eh? ;-) –

2

Un valor nulo al usar cada cierre es lo mismo que una colección con 0 elementos. Si tiene el código

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

La instrucción de impresión no se ejecutará. Si cambia la prueba a

def test=[1,2,3] 

obtendrá la salida.

Cuestiones relacionadas