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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.