loop:
c = 0
loop {
print "#{c} "
c += 1
print "#{c}, "
break if c == 5
} #-> 0 1, 1 2, 2 3, 3 4, 4 5,
Damit die loop-Schleife
auch kontrollierbar wird, bietet Ruby verschiedene
Kontrollmöglichkeiten:
Mit break wird die Schleife sofort verlassen, next beginnt
die nächste Iteration,
redo wiederholt die aktuelle
Iteration.
Die gleichen Kontrollmöglichkeiten gibt es auch für die while- und
until-Schleifen:
c = 0
while c < 5 do
print "#{c} "
c += 1
print "#{c}, "
end #-> 0 1, 1 2, 2 3, 3 4, 4 5,
until c >= 4 do
print "#{c} "
c += 1
print "#{c}, "
end #-> 0 1, 1 2, 2 3, 3 4, 4 5,
c = 0
while c < 5 do
print "#{c} "
c += 1
next if c >= 2
print "#{c}, "
end #-> 0 1, 1 2 3 4
c = 0
while c < 5 do
print "#{c} "
c += 1
redo if c >= 2
print "#{c}, "
end #-> 0 1, 1 2 3 4 5 6 7 8 9 ...
Der aufmerksame Leser wird bemerkt haben, dass bei while und until eine
von Rubys Unschönheiten (syntaktisch gesehen) lauert. Beide können ein
do..end haben, welches aber nicht meint, dass ein Codeblock beigestellt
ist :-(
Die Bedingung muss nicht unbedingt vor dem Schleifenkörper stehen. Mit den "`Modifikatoren"' kann man schreiben:
begin print "Passwort: " line = STDIN.gets end until line.strip == "Ruby rules!"
Dabei wird der Schleifenkörper einmal ausgeführt, bevor die Bedingung getestet wird.
Ebenfalls zulässig ist das "`Weglassen"' von begin..end bei einem
einzelnen Statement:
c = 0
print "#{c += 1} " while c < 10
#-> 1 2 3 4 5 6 7 8 9 10
print "#{c -= 1} " until c == 0
#-> 9 8 7 6 5 4 3 2 1 0
Im Gegensatz zu den Modifikatoren bei begin..end ist hierbei aber nicht garantiert,
dass der Schleifenkörper mindestens einmal durchlaufen wird.
print "niemals aufgerufen" while 1 == 2 begin print "einmal aufgerufen" end while 1 == 2 #-> einmal aufgerufen
Ruby kennt auch for-Schleifen, die als Resultat die
Aufzählung zurückgeben, über die sie gelaufen sind.
for c in 1..10 puts c end #-> 1..10 # Ausgabe auf die Konsole: 1 2 3 4 5 6 7 8 9 10
Neben den schon erwähnten Schleifenkontrollen unterstützt for
noch eine weitere Möglichkeit: retry erlaubt eine Wiederholung
der kompletten Iteration. Es empfiehlt sich
allerdings, dann eine zusätzliche Abbruchbedingung mit break
einzufügen, da ansonsten leicht Endlosschleifen entstehen können.
for c in 1..10
if c == 5
print " und nochmal\n"
retry
end
print c, " "
end #-> 1 2 3 4 und nochmal 1 2 3 4 ...