Die Programmiersprache Ruby (German Edition)
gefunden
end
Die
return
-Anweisung in diesem Code sorgt nicht nur dafür, dass der Block zu dem Iterator zurückkehrt, der ihn aufgerufen hat. Und sie sorgt auch nicht nur dafür, dass der Iterator
each_with_index
zurückkehrt. Sie sorgt dafür, dass die Methode
find
einen Wert an ihre aufrufende Stelle zurückgibt.
5.5.2 break
Wenn sie in einer Schleife verwendet wird, übergibt die Anweisung
break
die Kontrolle aus der Schleife heraus an den ersten Ausdruck, der auf die Schleife folgt. Leser, die C, Java oder eine ähnliche Sprache kennen, werden bereits mit der Verwendung von
break
in einer Schleife vertraut sein:
while(line = gets.chop) # Schleifenstart hier
break if line == "quit" # Wird diese break-Anweisung ausgeführt ...
puts eval(line)
end
puts "Wiedersehen" # ... dann wird die Kontrolle hierher übergeben
Bei Verwendung in einem Block überträgt
break
die Kontrolle aus dem Block heraus und aus dem Iterator heraus, der den Block aufgerufen hat, an den ersten Ausdruck der auf den Aufruf des Iterators folgt, zum Beispiel:
f.each do |line| # Über die Zeilen in Datei f iterieren
break if line == "quit\n" # Wird diese break-Anweisung ausgeführt ...
puts eval(line)
end
puts "Wiedersehen" # ... dann wird die Kontrolle hierher übergeben
Wie Sie sehen, ist die Verwendung von
break
innerhalb eines Blocks lexikalisch identisch mit seiner Verwendung in einer Schleife. Wenn Sie jedoch den Call-Stack betrachten, ist
break
in einem Block komplizierter, weil es erzwingt, dass die Iteratormethode, mit der der Block verknüpft ist, zurückkehrt. Abbildung 5.3 verdeutlicht das.
Abbildung 5.3 Die Anweisung break in einem Block
Beachten Sie, dass
break
, anders als
return
, niemals dafür sorgt, dass die lexikalisch umschließende Methode zurückkehrt.
break
kann nur innerhalb einer lexikalisch umschließenden Schleife oder innerhalb eines Blocks stehen. Seine Verwendung in irgendeinem anderen Kontext verursacht einen
LocalJumpError
.
5.5.2.1 break mit einem Wert
Denken Sie daran, dass alle syntaktischen Konstrukte in Ruby Ausdrücke sind und einen Wert haben können. Die
break
-Anweisung kann einen Wert für die Schleife oder den Iterator angeben, die sie verlässt. Auf das Schlüsselwort
break
kann ein Ausdruck oder eine kommaseparierte Liste von Ausdrücken folgen. Wenn
break
ohne Ausdruck verwendet wird, ist der Wert des Schleifenausdrucks oder der Rückgabewert der Iteratormethode
nil
. Wenn
break
mit einem einzelnen Ausdruck verwendet wird, wird der Wert dieses Ausdrucks zum Wert des Schleifenausdrucks beziehungsweise zum Rückgabewert des Iterators. Und wenn
break
mit mehreren Ausdrücken verwendet wird, dann werden die Werte dieser Ausdrücke in einem Array platziert, das zum Wert des Schleifenausdrucks oder zum Rückgabewert des Iterators wird.
Im Gegensatz dazu hat eine
while
-Schleife, die normal ohne
break
terminiert, stets den Wert
nil
. Der Rückgabewert eines Iterators, der normal terminiert, wird durch die Iteratormethode definiert. Viele Iteratoren wie times und
each
geben einfach das Objekt zurück, für das sie aufgerufen wurden.
5.5.3 next
Die Anweisung
next
sorgt dafür, dass eine Schleife oder ein Iterator die aktuelle Iteration abschließt und mit der nächsten beginnt. C- und Java-Programmierer kennen diese Kontrollstruktur unter dem Namen
continue
. Hier ist
next
in einer Schleife:
while(line = gets.chop) # Eine Schleife startet hier.
next if line[0,1] == "#" # Wenn die Zeile Kommentar ist, zur nächsten
puts eval(line)
# Die Steuerung geht hierhin, wenn die next-Anweisung ausgeführt wird.
end
Wenn
next
in einem Block verwendet wird, sorgt es dafür, dass der Block sofort beendet wird und die Kontrolle an die Iteratormethode zurückgibt, die dann eine neue Iteration beginnen kann, indem sie den Block erneut aufruft:
f.each do |line| # Über alle Zeilen in der Datei f iterieren
next if line[0,1] == "#" # Wenn die Zeile Kommentar ist, zur nächsten
puts eval(line)
# Die Steuerung geht hierhin, wenn die next-Anweisung ausgeführt wird.
end
Die Verwendung von
next
in einem Block ist lexikalisch identisch mit seinem Einsatz in einer
while
-,
until
- oder
for/in
-Schleife. Wenn Sie jedoch die Aufrufreihenfolge betrachten, ist der Block-Fall komplizierter, wie Abbildung 5.4 zeigt.
Abbildung 5.4 Die Anweisung next in einem Block
----
next, break und return
Es ist aufschlussreich, Abbildung 5.4 , Abbildung 5.2 und Abbildung 5.3 einander gegenüberzustellen. Die
Weitere Kostenlose Bücher