Die Programmiersprache Ruby (German Edition)
Anweisung
next
sorgt dafür, dass ein Block zu der Iteratormethode zurückkehrt, die ihn aufgerufen hat. Die Anweisung
break
sorgt dafür, dass der Block zu seinem Iterator zurückkehrt und der Iterator wiederum zur umschließenden Methode. Und die Anweisung
return
sorgt dafür, dass der Block zum Iterator zurückkehrt, der Iterator zur umschließenden Methode und die umschließende Methode zu ihrer aufrufenden Stelle.
----
next
kann nur in einer Schleife oder in einem Block verwendet werden; es löst einen
LocalJumpError
aus, wenn es in einem anderen Kontext verwendet wird.
5.5.3.1 next und der Blockwert
Genau wie die Schlüsselwörter
return
und
break
kann auch
next
entweder allein verwendet werden oder aber gefolgt von einem Ausdruck oder einer kommaseparierten Liste von Ausdrücken. Wenn
next
in einer Schleife verwendet wird, werden alle auf das
next
folgenden Werte ignoriert. In einem Block wird der Ausdruck beziehungsweise die Liste von Ausdrücken dagegen zum »Rückgabewert« der
yield
-Anweisung, die den Block aufgerufen hat. Wenn auf next kein Ausdruck folgt, ist der Wert von
yield nil
. Folgt ein Ausdruck auf
next
, wird der Wert dieses Ausdrucks zum Wert von
yield
. Und wenn auf
next
eine Liste von Ausdrücken folgt, dann ist der Wert von
yield
ein Array mit den Werten dieser Ausdrücke.
In unserer Beschreibung der Anweisung
return
haben wir genau erklärt, dass Blöcke keine Funktionen sind, und dass die
return
-Anweisung einen Block nicht zu dem Iterator zurückkehren lässt, der ihn aufgerufen hat. Wie Sie sehen können, ist das genau, was die Anweisung
next
tut. Hier sehen Sie Code, in dem Sie sie auf diese Weise nutzen könnten:
squareroots = data.collect do |x|
next 0 if x < 0 # Für negative Werte 0 zurückgeben
Math.sqrt(x)
end
Normalerweise ist der Wert eines
yield
-Ausdrucks der Wert des letzten Ausdrucks im Block. Genau wie bei der Anweisung
return
ist es oft nicht notwendig, explizit
next
zu verwenden, um einen Wert anzugeben. Dieser Code hätte beispielsweise auch so geschrieben werden können:
squareroots = data.collect do |x|
if (x < 0) then 0 else Math.sqrt(x) end
end
5.5.4 redo
Die Anweisung
redo
startet die aktuelle Iteration einer Schleife oder eines Iterators neu. Das ist nicht dasselbe wie
next
:
next
übergibt die Kontrolle an das Ende einer Schleife oder eines Blocks, so dass die nächste Iteration beginnen kann, während
redo
die Kontrolle zurück an den Anfang der Schleife oder des Blocks übergibt, so dass die Iteration neu starten kann. Wenn Sie von C-ähnlichen Sprachen zu Ruby kommen, ist
redo
für Sie wahrscheinlich eine neue Kontrollstruktur.
redo
übergibt die Kontrolle an den ersten Ausdruck im Rumpf der Schleife oder im Block. Es überprüft die Schleifenbedingung nicht erneut und holt nicht das nächste Element aus einem Iterator. Die folgende
while
-Schleife würde normalerweise nach drei Iterationen enden, aber eine
redo
-Anweisung sorgt dafür, dass sie viermal iteriert:
i = 0
while(i < 3) # Gibt "0123" statt "012" aus
# Kontrolle geht bei redo wieder hierhin
print i
i += 1
redo if i == 3
end
redo
ist keine häufig genutzte Anweisung, und viele Beispiele – z. B. dieses – sind konstruiert. Ein Einsatzgebiet besteht allerdings darin, Eingabefehler richtigzustellen, wenn ein Benutzer um eine Eingabe gebeten wird. Der folgende Code verwendet
redo
innerhalb eines Blocks zu diesem Zweck:
puts "Bitte geben Sie das erste Wort ein, an das Sie denken."
words = %w(Apfel Banane Kirsche) # Kurz für ["Apfel", "Banane", "Kirsche"]
response = words.collect do |word|
# Kontrolle geht bei redo wieder hierhin
print word + "> " # Den User fragen
response = gets.chop # Antwort erhalten
if response.size == 0 # Keine Eingabe?
word.upcase! # Aufforderung durch Großschreibung betonen
redo # Und zum Anfang des Blocks springen
end
response # Die Antwort zurückgeben
end
5.5.5 retry
Die Anweisung
retry
wird normalerweise in einer
rescue
-Klausel verwendet, um einen Codeblock erneut auszuführen, der eine Ausnahme ausgelöst hat. Das wird in „5.6.3.5 retry in einer rescue-Klausel“ beschrieben. In Ruby 1.8 hat
retry
dagegen einen anderen Verwendungszweck: Es startet eine iteratorbasierte Iteration (oder einen beliebigen Methodenaufruf) ganz von vorn. Dieser Einsatz der
retry
-Anweisung ist extrem selten und wurde in Ruby 1.9 aus der Sprache entfernt. Er sollte daher als veraltetes Sprachfeature betrachtet und nicht in neuem Code verwendet werden.
In einem
Weitere Kostenlose Bücher