for vs each en Ruby
En Ruby, puede iterar a través de un array utilizando tanto Array#each
como for..in
. Sin embargo, hay una diferencia significativa entre los dos.
Array#each
en Ruby
El método Ruby Array#each
es el método más sencillo y ampliamente utilizado para iterar elementos individuales en un array.
each
es un método incorporado de la clase Array, y es la forma más popular de iterar sobre los elementos de un array en Ruby.
each
toma un bloque como parámetro y devuelve el elemento actual.
[1, 2, 3].each { |n| puts n }
Producción :
1
2
3
El bucle for..in
en Ruby
Como la mayoría de los otros lenguajes de programación, Ruby tiene una instrucción for
para recorrer un array.
for
va seguido de una variable como el elemento actual y un array iterada.
for n in [1, 2, 3]
puts n
end
Producción :
1
2
3
Bajo el capó, Array#each
y for..in
casi hacen lo mismo. Sin embargo, hay una diferencia menor, que podría causar un problema grave.
[1, 2, 3].each { |n| n }
puts n
Producción :
NameError (undefined local variable or method `n' for main:Object)
Ejemplo de código:
for n in [1, 2, 3]
n
end
puts n
Producción :
3
Obtenemos un error si tratamos de imprimir n
después de Array#each
, pero imprime 3
después del bucle for
.
¿Que esta pasando?
Antes de ejecutar for..in
, la variable n
se define de antemano. Una vez que se completa el bloque, permanece visible fuera del bloque.
En otras palabras, el bucle for
es similar a:
n = nil
[1, 2, 3].each { |i| n = i }
puts n
Producción :
3
En el caso de Array#each
, la variable n
se define dentro del bloque { |n| puts n }
, por lo tanto, no es visible para nada fuera del alcance del bloque.
El uso de un bucle for
puede causar un problema frustrante al introducir una variable adicional como efecto secundario. Como resultado, se prefiere Array#each a for..in
.