Słowo kluczowe retry
omawialiśmy już przy okazji ponownego uruchamiania pętli po wystąpieniu wyjątków. Jego mało znany odpowiednik redo
działa podobnie, ale ponownie uruchamia iteracje pętli zamiast całych bloków.
Słowo kluczowe redo
Jak dowiedzieliśmy się w poprzednim artykule Akademii, retry
pozwala na ponowne wykonanie fragmentu kodu w bloku:
1 2 3 4 5 6 |
begin puts "Iteration" raise rescue retry end |
Ten przykład wypisuje słowo „Iteracja” na konsolę przed podniesieniem wyjątku. Wykonuje się blok ratunkowy, który wywołuje retry
i rozpoczyna blok ponownie od początku. W wyniku tego nasz program bez końca wypisuje Iteration
. Słowo kluczowe redo
pozwala osiągnąć podobny efekt podczas używania pętli. Jest to przydatne w sytuacjach, w których trzeba ponowić próbę podczas iteracji, na przykład.
1 2 3 4 |
10.times do |i| puts "Iteration #{i}" redo if i > 2 end |
W ten sposób zostanie wydrukowane:
1 2 3 4 5 6 7 8 |
$ ruby redo.rb Iteration 0 Iteration 1 Iteration 2 Iteration 3 Iteration 3 Iteration 3 ... |
Zauważ, że liczba iteracji pozostaje taka sama? Będzie to cofnięcie wykonania do początku pętli. Ten wariant kodu z użyciem retry
wydrukuje dokładnie to samo wyjście:
1 2 3 4 5 6 7 8 |
10.times do |i| begin puts "Iteration #{i}" raise if i > 2 rescue retry end end |
Możesz użyć redo
do implementacji ponownego próbowania w pętli. W kolejnym przykładzie mamy kolejkę zadań. Zwracają one albo :success
albo :failure
. Ponownie uruchamiamy tę samą iterację pętli, aż zadanie się powiedzie.
1 2 3 |
.each do |job| redo unless job.call == :success end |
Ruby 1.8
Zachowanie retry
i redo
zmieniło się pomiędzy Ruby 1.8 i 1.9. Kiedyś restartowały one iterację pętli, ale obie w inny sposób. Od 1.9, retry
działa tylko z blokiem begin
/rescue
, a redo
działa tylko wewnątrz pętli.
Słowo kluczowe next
Jeśli chcesz przejść do następnej iteracji pętli, w przeciwieństwie do cofania się do początku bieżącej, możesz użyć next
.
1 2 3 4 5 |
10.times do |i| puts "Iteration #{i}" next if i > 2 puts "Iteration done" end |
W ten sposób zostanie wydrukowane:
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 ... |
Widzisz jak licznik iteracji wciąż się zwiększa? W większości przypadków użycie next
jest tym, czego chcesz. Spójrz na redo
, jeśli potrzebujesz pętli, która wykona się dokładną liczbę razy lub potrzebujesz obsługi błędów podczas iteracji nad tablicą.
Mamy nadzieję, że nauczyłeś się czegoś nowego o ponownym wykonywaniu iteracji w pętlach i z przyjemnością dowiemy się, co myślisz o tym artykule (lub o innych z serii AppSignal Academy). Nie wahaj się dać nam znać co myślisz, lub jeśli masz jakieś tematy związane z Ruby, o których chciałbyś dowiedzieć się więcej.