Mais uma curiosidade de sintaxe do que um problema para resolver ...
Eu tenho duas matrizes de comprimento igual e quero iterar sobre as duas ao mesmo tempo - por exemplo, para gerar os dois valores em um determinado índice.
@budget = [ 100, 150, 25, 105 ]
@actual = [ 120, 100, 50, 100 ]
Eu sei que posso usar each_index
e indexar as matrizes da seguinte maneira:
@budget.each_index do |i|
puts @budget[i]
puts @actual[i]
end
Existe uma maneira Ruby de fazer isso melhor? Algo assim ?
# 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
Respostas:
fonte
Use o
Array.zip
método e passe um bloco para iterar sobre os elementos correspondentes sequencialmente.fonte
Há outra maneira de iterar mais de duas matrizes ao mesmo tempo usando enumeradores:
Os enumeradores são mais poderosos que os exemplos usados acima, porque permitem séries infinitas, iteração paralela, entre outras técnicas.
fonte
loop
mostrado acima?Além do
a.zip(b).each{|x,y| }
que outros disseram, você também pode dizer[a,b].transpose.each{|x,y| }
, o que me parece um pouco mais simétrico. Provavelmente não é tão rápido, pois você está criando uma[a,b]
matriz extra .fonte
transpose
é que isso gera uma exceção se as duas matrizes não tiverem o mesmo comprimento.Relacionado à pergunta original, para iterar sobre matrizes de comprimento desigual, nas quais você deseja que os valores circulem, você pode usar
e Ruby vai te dar
Isso evita os
nil
valores que você obterá usando apenas zipfonte
Simplesmente compactar as duas matrizes funciona bem se você estiver lidando com matrizes. Mas e se você estiver lidando com enumeradores intermináveis, como algo como estes:
enum1.zip(enum2)
falha porquezip
tenta avaliar todos os elementos e combiná-los. Em vez disso, faça o seguinte:Aquele
lazy
economiza, fazendo com que o enumerador resultante avalie preguiçosamente.fonte
Que tal comprometer e usar #each_with_index?
fonte