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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.