Wir haben über das Schlüsselwort retry
gesprochen, als wir die Wiederholung nach Ausnahmen besprachen. Sein wenig bekanntes Gegenstück redo
funktioniert ähnlich, führt aber Schleifenwiederholungen anstelle von ganzen Blöcken aus.
Das redo-Schlüsselwort
Wie wir im vorigen Academy-Artikel gelernt haben, kann man mit retry
einen Teil des Codes in einem Block wiederholen:
1 2 3 4 5 6 |
begin puts "Iteration" raise rescue retry end |
In diesem Beispiel wird das Wort „Iteration“ auf der Konsole ausgegeben, bevor eine Ausnahme ausgelöst wird. Der Rettungsblock wird ausgeführt, der retry
aufruft und den Block wieder von vorne beginnt. Dies führt dazu, dass unser Programm endlos Iteration
ausgibt. Mit dem Schlüsselwort redo
können Sie einen ähnlichen Effekt bei der Verwendung von Schleifen erzielen. Dies ist nützlich, wenn Sie z. B. während einer Iteration einen neuen Versuch starten müssen.
1 2 3 4 |
10.times do |i| puts "Iteration #{i}" redo if i > 2 end |
Dies wird gedruckt:
1 2 3 4 5 6 7 8 |
$ ruby redo.rb Iteration 0 Iteration 1 Iteration 2 Iteration 3 Iteration 3 Iteration 3 ... |
Beachten Sie, dass die Anzahl der Iterationen gleich bleibt? Die Ausführung wird an den Anfang der Schleife zurückgesetzt. Diese Variante des Codes mit retry
gibt genau die gleiche Ausgabe aus:
1 2 3 4 5 6 7 8 |
10.times do |i| begin puts "Iteration #{i}" raise if i > 2 rescue retry end end |
Sie können redo
verwenden, um die Wiederholung in einer Schleife zu implementieren. Im nächsten Beispiel haben wir eine Warteschlange von Aufträgen. Sie geben entweder :success
oder :failure
zurück. Wir führen dieselbe Iteration der Schleife so lange aus, bis der Job erfolgreich ist.
1 2 3 |
.each do |job| redo unless job.call == :success end |
Ruby 1.8
Das Verhalten von retry
und redo
hat sich zwischen Ruby 1.8 und 1.9 geändert. Früher haben sie die Iteration der Schleife neu gestartet, aber beide auf eine andere Art und Weise. Ab 1.9 funktioniert retry
nur noch mit einem begin
/rescue
-Block und redo
funktioniert nur noch innerhalb von Schleifen.
Das next-Schlüsselwort
Wenn man zur nächsten Iteration der Schleife springen will, anstatt zurück zum Anfang der aktuellen, kann man next
verwenden.
1 2 3 4 5 |
10.times do |i| puts "Iteration #{i}" next if i > 2 puts "Iteration done" end |
Dies wird gedruckt:
1 2 3 4 5 6 7 8 9 10 |
$ ruby next.rb Iteration 0 Iteration done Iteration 1 Iteration done Iteration 2 Iteration done Iteration 3 Iteration 4 ... |
Siehst du, wie sich der Iterationszähler ständig erhöht? In den meisten Fällen ist next
das, was Sie wollen. Schauen Sie sich redo
an, wenn Sie eine Schleife benötigen, die eine genaue Anzahl von Malen durchläuft oder eine Fehlerbehandlung benötigt, wenn über ein Array iteriert wird.
Wir hoffen, dass Sie etwas Neues über die Wiederholung von Iterationen in Schleifen gelernt haben und würden uns freuen zu erfahren, was Sie von diesem Artikel (oder einem der anderen in der AppSignal Academy Serie) halten. Bitte zögern Sie nicht, uns Ihre Meinung mitzuteilen oder uns mitzuteilen, über welche Ruby-Themen Sie gerne mehr erfahren möchten.