Solo quiero hacer un punto específico sobre el ciclo for in en Ruby. Puede parecer una construcción similar a otros lenguajes, pero de hecho es una expresión como cualquier otra construcción en bucle en Ruby. De hecho, for in funciona con objetos Enumerable al igual que cada iterador.
La colección pasada a for in puede ser cualquier objeto que tenga un método de cada iterador. Las matrices y los hash definen cada método, y muchos otros objetos Ruby también lo hacen. El bucle for / in llama a cada método del objeto especificado. A medida que ese iterador produce valores, el bucle for asigna cada valor (o cada conjunto de valores) a la variable (o variables) especificadas y luego ejecuta el código en el cuerpo.
Este es un ejemplo tonto, pero ilustra el punto de que el bucle for in funciona con CUALQUIER objeto que tenga cada método, tal como lo hace cada iterador:
class Apple
TYPES = %w(red green yellow)
def each
yield TYPES.pop until TYPES.empty?
end
end
a = Apple.new
for i in a do
puts i
end
yellow
green
red
=> nil
Y ahora el cada iterador:
a = Apple.new
a.each do |i|
puts i
end
yellow
green
red
=> nil
Como puede ver, ambos están respondiendo a cada método que devuelve valores al bloque. Como todos declararon aquí, definitivamente es preferible usar cada iterador sobre el ciclo for in. Solo quería llevar a casa el punto de que no hay nada mágico en el bucle for. Es una expresión que invoca cada método de una colección y luego lo pasa a su bloque de código. Por lo tanto, es un caso muy raro que necesitaría usar. Use cada iterador casi siempre (con el beneficio adicional del alcance del bloque).