Eine Schleife ist eine Kontrollstruktur, mit der Code abhängig von einer Bedingung wiederholt ausgeführt werden kann.
Eine while-Schleife ist eine Kontrollstruktur, mit der Code abhängig von einer Bedingung wiederholt ausgeführt werden kann. Der Code innerhalb einer while-Schleife wird so lange ausgeführt, wie die Bedingung truthy ergibt. while-Schleifen werden oft verwendet, wenn die Anzahl der Iterationen im Voraus unbekannt ist; sie können in jeder Situation eingesetzt werden, in der eine Schleife gebraucht wird.
Die Bedingung wird ausgewertet, bevor der Code innerhalb der Schleife ausgeführt wird. Ist die Bedingung falsch, wird der Code in der Schleife nie ausgeführt.
i = 0
while i < 3
puts i
i += 1
end
# Output:
# 0
# 1
# 2
Wenn du über einen String iterieren möchtest, kannst du über die Länge des Strings iterieren.
str = "Hello"
i = 0
while i < str.size
puts str[i]
i += 1
end
# Output:
# H
# e
# l
# l
# o
until-Schleifen funktionieren genauso wie while-Schleifen, außer dass der Code innerhalb der Schleife so lange ausgeführt wird, bis die Bedingung truthy ergibt.
Es ist derselbe Unterschied wie zwischen if und unless.
i = 0
until i == 3
puts i
i += 1
end
Ein häufiger Fehler bei while-Schleifen ist eine „Endlosschleife“, die nie endet. Eine Endlosschleife kann entstehen, wenn eine Bedingung nie truthy oder falsey ergibt. Das liegt oft an einem Programmierfehler, zum Beispiel daran, dass man vergisst, die Schleifenvariable zu erhöhen. Manchmal ist eine Endlosschleife aber die klarste Art, die Logik des Programms umzusetzen. Oder es ist wichtig, endlos zu schleifen: Ein HTTP-Server wartet zum Beispiel auf eine eingehende Verbindung, verarbeitet sie und wartet dann auf die nächste Verbindung.
Mit dem Schlüsselwort break kannst du eine Schleife vorzeitig verlassen.
Das ist praktisch, wenn du eine Schleife unter bestimmten Bedingungen früh verlassen möchtest.
i = 0
while i <= 3
puts i
i += 1
if i == 2
break
end
end
# Output:
# 0
# 1
Mit dem Schlüsselwort next kannst du zur nächsten Iteration einer Schleife springen.
Das ist praktisch, wenn du bestimmte Iterationen einer Schleife überspringen möchtest.
i = 0
while i <= 3
i += 1
if i == 2
next
end
puts i
end
# Output:
# 1
# 3
Der Typ einer Variable kann sich innerhalb einer Schleife unterscheiden.
Im folgenden Beispiel ist der Typ von a gleich Int32 | String, weil er im ersten Teil der Schleife Int32 oder String sein kann.
Die Variable a hat nur im ersten Teil der Schleife den Typ Int32 | String, denn beim Start der Schleife enthält sie Int32 und in der zweiten Iteration einen String.
Dieses System mit mehreren Typen wird später ausführlich erklärt.
Da wir aber sicher sind, dass der zweite Teil der Schleife nur String enthält, ist der Typ von a im zweiten Teil der Schleife String.
Zur Laufzeit enthält sie nie gleichzeitig Int32 und String.
i = 0
a = 4
while i < 3
p typeof(a)
# => Int32 | String
a = "4"
p typeof(a)
# => String
i += 1
end
while kann als Ausdruck verwendet werden, das heißt, es kann als Wert einer Variable dienen.
Der zurückgegebene Wert ist der Wert, der mit dem Schlüsselwort break angegeben wird.
Der Wert des letzten Ausdrucks in der Schleife wird nicht zurückgegeben.
a = while true
break 1
end
p a
# => 1
i = 0
a = while i == 0
i += 1
1
end
p a
# => nil