O klíčovém slově retry
jsme hovořili při probírání opakování pokusu po výjimkách. Jeho málo známý protějšek redo
funguje podobně, ale místo celých bloků opakuje iterace cyklu.
Klíčové slovo redo
Jak jsme se dozvěděli v předchozím článku Akademie, retry
umožňuje opakovat opakování části kódu v bloku:
1 2 3 4 5 6 |
begin puts "Iteration" raise rescue retry end |
Tento příklad vypíše na konzolu slovo „Iterace“ před vyvoláním výjimky. Provede se záchranný blok, který zavolá retry
a spustí blok znovu od začátku. Výsledkem je, že náš program donekonečna vypisuje Iteration
. Klíčové slovo redo
umožňuje dosáhnout podobného efektu při použití cyklů. To je užitečné například v situacích, kdy potřebujete opakovat pokus při iteraci.
1 2 3 4 |
10.times do |i| puts "Iteration #{i}" redo if i > 2 end |
Tímto způsobem se vypíše:
1 2 3 4 5 6 7 8 |
$ ruby redo.rb Iteration 0 Iteration 1 Iteration 2 Iteration 3 Iteration 3 Iteration 3 ... |
Všimli jste si, že počet iterací zůstává stejný? Provedení se vrátí o krok zpět na začátek smyčky. Tato varianta kódu s použitím retry
vypíše úplně stejný výstup:
1 2 3 4 5 6 7 8 |
10.times do |i| begin puts "Iteration #{i}" raise if i > 2 rescue retry end end |
Pro implementaci opakování v cyklu můžete použít redo
. V dalším příkladu máme frontu úloh. Ty vracejí buď :success
, nebo :failure
. Stále opakujeme stejnou iteraci cyklu, dokud úloha neuspěje.
1 2 3 |
.each do |job| redo unless job.call == :success end |
Ruby 1.8
Chování retry
a redo
se mezi verzemi Ruby 1.8 a 1.9 změnilo. Dříve restartovaly iteraci smyčky, ale obě jiným způsobem. Od verze 1.9 funguje retry
pouze s blokem begin
/rescue
a redo
funguje pouze uvnitř smyček.
Klíčové slovo next
Pokud se chcete přesunout na další iteraci cyklu, na rozdíl od přesunu zpět na začátek té aktuální, můžete použít next
.
1 2 3 4 5 |
10.times do |i| puts "Iteration #{i}" next if i > 2 puts "Iteration done" end |
Tímto způsobem se vypíše:
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 ... |
Vidíte, jak se čítač iterací stále zvyšuje? Ve většině případů je použití next
to, co chcete. Podívejte se na redo
, pokud potřebujete cyklus, který proběhne přesný početkrát nebo potřebujete ošetřit chyby při iteraci nad polem.
Doufáme, že jste se dozvěděli něco nového o opakování iterací v cyklech a budeme rádi, když nám sdělíte svůj názor na tento článek (nebo na kterýkoli jiný ze série AppSignal Academy). Neváhejte nám dát vědět, co si myslíte, nebo pokud máte nějaké téma o Ruby, o kterém byste se rádi dozvěděli více.