Was ist ein besserer Weg, um ein Array zu durchlaufen, während man durch ein anderes Array iteriert? Zum Beispiel, wenn ich zwei Arrays wie das Folgende habe:
%Vor%Angenommen, die Arrays entsprechen einander - das heißt, Rover ist ein Terrier, Fido ist ein Lhasa Apso, usw. - Ich möchte eine Hundeklasse und ein neues Hund-Objekt für jeden Gegenstand erstellen:
> %Vor%Ich kann Namen und Rassen mit folgendem durchlaufen:
%Vor%Ich habe jedoch das Gefühl, dass die Verwendung der Indexvariablen der falsche Weg ist. Was wäre ein besserer Weg?
Array#zip
verschachtelt das Zielarray mit Elementen der Argumente, also
Sie können Arrays unterschiedlicher Länge verwenden (in diesem Fall bestimmt das Zielarray die Länge des resultierenden Arrays, wobei die zusätzlichen Einträge mit nil
ausgefüllt werden).
Sie können auch mehr als zwei Arrays zusammenfügen:
%Vor% Array#map
ist ein großartiger Weg, um ein Array zu transformieren, da es ein Array zurückgibt, in dem jeder Eintrag das Ergebnis der Ausführung des Blocks auf dem entsprechenden Eintrag im Ziel-Array ist.
Wenn Sie bei der Verwendung von Iteratoren über Arrays von Arrays einen Block mit mehreren Parametern angeben, werden die Array-Einträge automatisch in diese Parameter unterteilt:
%Vor% Wie Matt Briggs erwähnt , #each_with_index
ist ein weiteres gutes Tool, das man kennen sollte. Es durchläuft die Elemente eines Arrays und übergibt nacheinander jedem Element einen Block.
Wenn Sie einen Iterator wie #each_with_index
verwenden, können Sie Array-Elemente in ihre Bestandteile zerlegen:
each_with_index springt in den Sinn, es ist ein besserer Weg, es so zu machen, wie Sie sind es tun. rampion hat eine bessere allgemeine Antwort, diese Situation ist, wofür zip ist.
Dies wurde von Flanagan und Matz, "The Ruby Programming Language", 5.3.5 "Externe Iteratoren", Beispiel 5-1, p. 139:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %Vor%
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ausgabe:
%Vor%was ich denke, was wir wollten!
Sowie each_with_index
(von Matt erwähnt) gibt es each_index
. Ich benutze das manchmal, weil es das Programm symmetrischer macht und daher falscher Code falsch aussieht .