for vs each in Ruby

Stewart Nguyen 30 Januar 2023 18 April 2022 Ruby Ruby Loop
  1. Array#each in Ruby
  2. Die for..in-Schleife in Ruby
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.