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.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.