Ich möchte nur einen bestimmten Punkt über die for in-Schleife in Ruby ansprechen. Es mag wie ein Konstrukt erscheinen, das anderen Sprachen ähnlich ist, aber tatsächlich ist es ein Ausdruck wie jedes andere Schleifenkonstrukt in Ruby. Tatsächlich funktioniert das for in mit Enumerable-Objekten genauso wie jeder Iterator.
Die an for in übergebene Auflistung kann ein beliebiges Objekt sein, das über eine Iteratormethode verfügt. Arrays und Hashes definieren jede Methode, und viele andere Ruby-Objekte auch. Die for / in-Schleife ruft jede Methode des angegebenen Objekts auf. Da dieser Iterator Werte liefert, weist die for-Schleife jeden Wert (oder jeden Wertesatz) der angegebenen Variablen (oder Variablen) zu und führt dann den Code im Hauptteil aus.
Dies ist ein dummes Beispiel, veranschaulicht jedoch den Punkt, an dem die for in-Schleife mit JEDEM Objekt funktioniert, das über jede Methode verfügt, genau wie der jeweilige Iterator:
class Apple
TYPES = %w(red green yellow)
def each
yield TYPES.pop until TYPES.empty?
end
end
a = Apple.new
for i in a do
puts i
end
yellow
green
red
=> nil
Und jetzt jeder Iterator:
a = Apple.new
a.each do |i|
puts i
end
yellow
green
red
=> nil
Wie Sie sehen können, reagieren beide auf jede Methode, die dem Block Werte zurückgibt. Wie alle hier angegeben haben, ist es definitiv vorzuziehen, jeden Iterator gegenüber der for in-Schleife zu verwenden. Ich wollte nur den Punkt nach Hause fahren, dass die for-in-Schleife nichts Magisches ist. Es ist ein Ausdruck, der jede Methode einer Sammlung aufruft und sie dann an ihren Codeblock übergibt. Daher ist es ein sehr seltener Fall, den Sie für in verwenden müssten. Verwenden Sie fast immer jeden Iterator (mit dem zusätzlichen Vorteil des Blockumfangs).