2011-10-07 17 views
6

Por ejemplo:¿Cómo implementar un enumerador en Ruby?

a = [1,2,3,4,5] 
a.delete_if { |x| x > 3 } 

es equivalente a:

a = [1,2,3,4,5] 
a.delete_if.each.each.each.each { |x| x > 3 } 

a.delete_if Devuelve un enumerador. Pero, ¿cómo sabe que debería eliminar objeto cuando el bloque each devuelve verdadero? ¿Cómo implementar delete_if a mano (y en Ruby)?

+0

'[1,2,3,4,5] .delete_if.each .each.each cada uno {| x | x> 3} '¿Podrías por favor elaborar un poco más en esta línea? –

+0

¿por qué no es 'delete_if.each' lo mismo que' each'? ¿Cómo recuerda 'delete_if' qué debería hacer? –

Respuesta

1

En la implementación de delete_if, el código puede verificar el valor devuelto desde yield para decidir si eliminar o no la entrada dada de la matriz.

Usted puede leer Implementing Iterators en la Guía de programación de Ruby para más detalles, pero sería ve algo como:

class Array 
    def delete_if 
    reject { |i| yield i }.to_a 
    end 
end 

los usos anteriores yield para pasar cada elemento de la matriz al bloque asociado con la llamada a delete_if, e implícitamente devuelve el valor de yield a la llamada externa reject.

4

Puede echar un vistazo al código fuente Rubinius: enumerable module

Aquí un ejemplo del método de rechazar:

def reject 
    return to_enum(:reject) unless block_given? 

    ary = [] 
    each do |o| 
     ary << o unless yield(o) 
    end 

    ary 
    end 
Cuestiones relacionadas