Plus une curiosité syntaxique qu'un problème à résoudre ...
J'ai deux tableaux de longueur égale et je veux les parcourir tous les deux à la fois - par exemple, pour afficher leurs deux valeurs à un certain index.
@budget = [ 100, 150, 25, 105 ]
@actual = [ 120, 100, 50, 100 ]
Je sais que je peux utiliser each_index
et indexer dans les tableaux comme ceci:
@budget.each_index do |i|
puts @budget[i]
puts @actual[i]
end
Existe-t-il un moyen Ruby de mieux faire cela? Quelque chose comme ça?
# 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
Réponses:
la source
Utilisez le
Array.zip
méthode et passez-lui un bloc pour parcourir les éléments correspondants de manière séquentielle.la source
Il existe une autre façon d'itérer sur deux tableaux à la fois en utilisant des énumérateurs:
Les énumérateurs sont plus puissants que les exemples utilisés ci-dessus, car ils permettent des séries infinies, des itérations parallèles, entre autres techniques.
la source
loop
illustration ci-dessus?En plus de ce
a.zip(b).each{|x,y| }
que d'autres ont dit, vous pouvez également dire[a,b].transpose.each{|x,y| }
, ce qui me semble un peu plus symétrique. Probablement pas aussi rapide, cependant, puisque vous créez le[a,b]
tableau supplémentaire .la source
transpose
est qu'il lève une exception si les deux tableaux ne sont pas de la même longueur.Lié à la question d'origine, pour itérer sur des tableaux de longueur inégale où vous voulez que les valeurs circulent, vous pouvez utiliser
et Ruby vous donnera
Cela vous évite les
nil
valeurs que vous obtiendrez en utilisant simplement zipla source
Le simple fait de compresser les deux tableaux ensemble fonctionne bien si vous avez affaire à des tableaux. Mais que se passe-t-il si vous avez affaire à des énumérateurs sans fin, tels que quelque chose comme ceux-ci:
enum1.zip(enum2)
échoue carzip
essaie d'évaluer tous les éléments et de les combiner. Faites plutôt ceci:Celui-ci
lazy
vous sauve en faisant l'évaluation paresseuse de l'énumérateur résultant.la source
Que diriez-vous de faire des compromis et d'utiliser #each_with_index?
la source