Nie verwenden Sie for
es kann Fehler verursachen.
Der Unterschied ist subtil, kann aber große Fehler verursachen!
Lassen Sie sich nicht täuschen, es geht nicht um idiomatische Code- oder Stilprobleme. Dies ist eine Frage der Vermeidung fast unauffindbarer Fehler im Produktionscode. Rubys Implementierung von for
weist einen schwerwiegenden Fehler auf und sollte nicht verwendet werden. Verwenden Sie immer each
Loops, niemals for
Schleife verwenden. Hier
ist ein Beispiel, wo for
einen Fehler einführt,
class Library
def initialize
@ary = []
end
def method_with_block(&block)
@ary << block
end
def method_that_uses_these_blocks
@ary.map(&:call)
end
end
lib = Library.new
for n in %w{foo bar quz}
lib.method_with_block { n }
end
puts lib.method_that_uses_these_blocks
Drucke
quz
quz
quz
Mit %w{foo bar quz}.each { |n| ... }
druckt
foo
bar
quz
Warum? In einer for
-Schleife wird die Variable n
nur einmal definiert und dann wird diese eine Definition für alle Iterationen verwendet. Daher beziehen sich alle Blöcke auf denselben n
, der zum Zeitpunkt des Schleifenendes einen Wert von quz
hat. Fehler!
In einer each
Schleife wird für jede Iteration eine neue Variable n
definiert, zum Beispiel wird oberhalb der Variablen n
drei separate Zeiten definiert. Daher bezieht sich jeder Block auf einen separaten n
mit den korrekten Werten.
Dort ist ein kleiner Unterschied (wie Yerem, ChristopheD und Bayard erwähnen) bezüglich des variablen Umfangs. – Telemachus
Falsch, 'for' verwendet nicht' each' darunter. Siehe andere Antworten. – akuhn
@akuhn Zur weiteren Klärung siehe bitte [question] (http://stackoverflow.com/q/39839809/5101493) und die beiden ausgezeichneten Antworten. –