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
.