Eher eine Syntax-Neugier als ein zu lösendes Problem ...
Ich habe zwei Arrays gleicher Länge und möchte beide gleichzeitig durchlaufen - zum Beispiel, um beide Werte an einem bestimmten Index auszugeben.
@budget = [ 100, 150, 25, 105 ]
@actual = [ 120, 100, 50, 100 ]
Ich weiß, dass ich each_index
die Arrays wie folgt verwenden und indizieren kann :
@budget.each_index do |i|
puts @budget[i]
puts @actual[i]
end
Gibt es einen Ruby-Weg , um dies besser zu machen? Etwas wie das?
# 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
Antworten:
quelle
Verwenden Sie die
Array.zip
Methode und übergeben Sie ihr einen Block, um die entsprechenden Elemente nacheinander zu durchlaufen.quelle
Es gibt eine andere Möglichkeit, zwei Arrays gleichzeitig mithilfe von Enumeratoren zu durchlaufen:
Enumeratoren sind leistungsfähiger als die oben verwendeten Beispiele, da sie unter anderem unendliche Reihen und parallele Iterationen ermöglichen.
quelle
loop
oben gezeigten zu bringen?Zusätzlich zu dem,
a.zip(b).each{|x,y| }
was andere gesagt haben, kann man auch sagen[a,b].transpose.each{|x,y| }
, was mir ein bisschen symmetrischer vorkommt. Wahrscheinlich nicht so schnell, da Sie das zusätzliche[a,b]
Array erstellen .quelle
transpose
ist, dass es eine Ausnahme auslöst, wenn die beiden Arrays nicht gleich lang sind.Bezogen auf die ursprüngliche Frage, können Sie Arrays mit ungleicher Länge durchlaufen, in denen die Werte durchlaufen sollen
und Ruby wird dir geben
Dies erspart Ihnen die
nil
Werte, die Sie nur durch die Verwendung von zip erhaltenquelle
Das einfache Zusammenzippen der beiden Arrays funktioniert gut, wenn Sie mit Arrays arbeiten. Aber was ist, wenn Sie es mit endlosen Enumeratoren wie diesen zu tun haben:
enum1.zip(enum2)
schlägt fehl, weilzip
versucht wird, alle Elemente auszuwerten und zu kombinieren. Tun Sie stattdessen Folgendes:Dieser
lazy
spart Ihnen, indem er den resultierenden Enumerator faul auswertet.quelle
Wie wäre es mit Kompromissen und der Verwendung von #each_with_index?
quelle