next up previous contents index
Search Next: Bereiche Up: Kontrollstrukturen und Wertebereiche Previous: Mehrfachverzweigung   Contents   Index


Schleifen und Schleifenkontrolle

Die einfachste Form der Wiederholung ist die Endlosschleife mit der Methode 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 ...


\epsfig{height=36pt,file=images/chan.eps}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 :-( \epsfig{height=10pt,file=images/ruby.eps}

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


\epsfig{height=36pt,file=images/chan.eps}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
\epsfig{height=10pt,file=images/ruby.eps}

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 ...


next up previous contents index
Search Next: Bereiche Up: Kontrollstrukturen und Wertebereiche Previous: Mehrfachverzweigung   Contents   Index
(C) 2002 by dpunkt.de, Armin Roehrl, Stefan Schmiedl, Clemens Wyss 2002-01-20