Este es un ejemplo dar contenido a su código de ejemplo:
class MyClass
attr_accessor :items
def initialize(ary=[])
@items = ary
end
def each
@items.each do |item|
yield item
end
end
end
my_class = MyClass.new(%w[a b c d])
my_class.each do |y|
puts y
end
# >> a
# >> b
# >> c
# >> d
each
bucles más de una colección. En este caso, está girando sobre cada elemento en la matriz @items
, inicializado/creado cuando hice la instrucción new(%w[a b c d])
.
yield item
en el método MyClass.each
pasa item
al bloque unido a my_class.each
. El item
cedido se asigna al local y
.
¿Eso ayuda?
Ahora, aquí hay un poco más sobre cómo funciona each
. Utilizando la misma definición de clase, aquí hay algo de código:
my_class = MyClass.new(%w[a b c d])
# This points to the `each` Enumerator/method of the @items array in your instance via
# the accessor you defined, not the method "each" you've defined.
my_class_iterator = my_class.items.each # => #<Enumerator: ["a", "b", "c", "d"]:each>
# get the next item on the array
my_class_iterator.next # => "a"
# get the next item on the array
my_class_iterator.next # => "b"
# get the next item on the array
my_class_iterator.next # => "c"
# get the next item on the array
my_class_iterator.next # => "d"
# get the next item on the array
my_class_iterator.next # =>
# ~> -:21:in `next': iteration reached an end (StopIteration)
# ~> from -:21:in `<main>'
en cuenta que en el último next
el iterador se cayó de la final de la matriz. Esta es la trampa potencial para NOT usando un bloque porque si no sabe cuántos elementos hay en la matriz, puede solicitar demasiados elementos y obtener una excepción.
El uso de each
con un bloque se repetirá sobre el receptor @items
y se detendrá cuando llegue al último elemento, evitando el error y manteniendo las cosas limpias.
Muchas gracias! –