for vs each in Ruby
In Ruby können Sie sowohl mit Array#each als auch mit for..in durch ein Array iterieren. Es gibt jedoch einen signifikanten Unterschied zwischen den beiden.
Array#each in Ruby
Die Ruby-Methode Array#each ist die einfachste und am weitesten verbreitete Methode zum Iterieren einzelner Elemente in einem Array.
each ist eine eingebaute Methode der Klasse Array und die beliebteste Art, die Elemente im Ruby-Array zu durchlaufen.
each nimmt einen Block als Parameter und gibt das aktuelle Element zurück.
[1, 2, 3].each { |n| puts n }
Ausgabe:
1
2
3
Die for..in-Schleife in Ruby
Wie die meisten anderen Programmiersprachen hat Ruby eine for-Anweisung zum Durchlaufen eines Arrays.
Auf for folgt eine Variable als aktuelles Element und ein iteriertes Array.
for n in [1, 2, 3]
puts n
end
Ausgabe:
1
2
3
Unter der Haube machen Array#each und for..in fast dasselbe. Es gibt jedoch einen kleinen Unterschied, der ein schwerwiegendes Problem verursachen könnte.
[1, 2, 3].each { |n| n }
puts n
Ausgabe:
NameError (undefined local variable or method `n' for main:Object)
Codebeispiel:
for n in [1, 2, 3]
n
end
puts n
Ausgabe:
3
Wir erhalten einen Fehler, wenn wir versuchen, n nach Array#each zu drucken, aber es wird 3 nach der for-Schleife gedruckt.
Was ist los?
Bevor for..in ausgeführt wird, wird die Variable n vorab definiert. Nachdem der Block abgeschlossen ist, bleibt er außerhalb des Blocks sichtbar.
Mit anderen Worten, die for-Schleife ist ähnlich wie:
n = nil
[1, 2, 3].each { |i| n = i }
puts n
Ausgabe:
3
Bei Array#each wird die Variable n innerhalb des Blocks { |n| puts n }, daher ist es für nichts außerhalb des Geltungsbereichs des Blocks sichtbar.
Die Verwendung einer for-Schleife kann ein frustrierendes Problem verursachen, da als Nebeneffekt eine zusätzliche Variable eingeführt wird. Als Ergebnis wird Array#each bevorzugt gegenüber for..in.