Más una curiosidad sintáctica que un problema a resolver ...
Tengo dos matrices de igual longitud, y quiero iterar sobre ambas a la vez, por ejemplo, para emitir ambos valores en un cierto índice.
@budget = [ 100, 150, 25, 105 ]
@actual = [ 120, 100, 50, 100 ]
Sé que puedo usar each_index
e indexar en las matrices de esta manera:
@budget.each_index do |i|
puts @budget[i]
puts @actual[i]
end
¿Hay alguna manera de Ruby para hacer esto mejor? Algo como esto?
# Obviously doesn't achieve what I want it to - but is there something like this?
[@budget, @actual].each do |budget, actual|
puts budget
puts actual
end
Respuestas:
fuente
Use el
Array.zip
método y páselo un bloque para iterar sobre los elementos correspondientes secuencialmente.fuente
Hay otra forma de iterar sobre dos matrices a la vez utilizando enumeradores:
Los enumeradores son más potentes que los ejemplos utilizados anteriormente, ya que permiten series infinitas, iteraciones paralelas, entre otras técnicas.
fuente
loop
muestra arriba?Además de lo
a.zip(b).each{|x,y| }
que otros han dicho, también se puede decir[a,b].transpose.each{|x,y| }
, lo que me parece un poco más simétrico. Sin embargo, probablemente no sea tan rápido, ya que está creando la[a,b]
matriz adicional .fuente
transpose
es que genera una excepción si las dos matrices no tienen la misma longitud.Relacionado con la pregunta original, para iterar sobre matrices de longitud desigual donde desea que los valores circulen, puede usar
y Ruby te dará
Esto te salva de los
nil
valores que obtendrás con solo usar zipfuente
Simplemente comprimir las dos matrices juntas funciona bien si se trata de matrices. Pero, ¿qué pasa si se trata de enumeradores interminables, como algo como esto:
enum1.zip(enum2)
falla porquezip
intenta evaluar todos los elementos y combinarlos. En cambio, haz esto:Ese
lazy
te salva al hacer que el enumerador resultante sea de evaluación diferida.fuente
¿Qué tal comprometerse y usar #each_with_index?
fuente