A retry kulcsszóról már beszéltünk, amikor a kivételek utáni újrapróbálkozást tárgyaltuk. Kevéssé ismert megfelelője redo hasonlóan működik, de egész blokkok helyett ciklus iterációkat hajt végre újra.

A redo kulcsszó

Amint azt az előző Academy cikkben megtanultuk, a retry segítségével egy blokkban lévő kódrészletet újrapróbálhatunk:

1 2 3 4 5 6
begin puts "Iteration" raise rescue retry end 

Ez a példa az “Iteration” szót írja ki a konzolra, mielőtt kivételt váltana ki. A mentőblokk végrehajtódik, ami meghívja a retry és újraindítja a blokkot az elejéről. Ez azt eredményezi, hogy a programunk a végtelenségig Iteration-t nyomtat. A redo kulcsszóval hasonló hatást érhetünk el ciklusok használatakor. Ez olyan helyzetekben hasznos, amikor például iterálás közben újra kell próbálkoznunk.

1 2 3 4
10.times do |i| puts "Iteration #{i}" redo if i > 2 end 

Ez kiírja:

1 2 3 4 5 6 7 8
$ ruby redo.rb Iteration 0 Iteration 1 Iteration 2 Iteration 3 Iteration 3 Iteration 3 ... 

Észrevetted, hogy az iterációk száma ugyanaz marad? Visszalép a végrehajtás a ciklus elejére. A kódnak ez a változata a retry használatával pontosan ugyanazt a kimenetet fogja kiírni:

1 2 3 4 5 6 7 8
10.times do |i| begin puts "Iteration #{i}" raise if i > 2 rescue retry end end 

A redo segítségével megvalósíthatja a ciklusban az újrapróbálást. A következő példában van egy munkákból álló sorunk. Ezek vagy :success vagy :failure adnak vissza. A ciklus ugyanazon iterációját addig ismételjük, amíg a feladat sikerrel nem jár.

1 2 3
.each do |job| redo unless job.call == :success end 

Ruby 1.8

A retry és redo viselkedése megváltozott a Ruby 1.8 és 1.9 között. Régebben újraindították a ciklus iterációját, de mindkettő más módon. Az 1.9-től a retry csak begin/rescue blokkokkal működik, a redo pedig csak ciklusokon belül.

A következő kulcsszó

Ha a ciklus következő iterációjára akarsz lépni, ahelyett, hogy az aktuális ciklus elejére lépnél vissza, akkor használhatod a next-et.

1 2 3 4 5
10.times do |i| puts "Iteration #{i}" next if i > 2 puts "Iteration done" end 

Ez kiírja:

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 ... 

Láttad, hogy az iterációs számláló folyamatosan növekszik? A legtöbb esetben a next használata az, amit szeretne. Nézd meg a redo-t, ha olyan ciklusra van szükséged, amely pontosan hányszor fut le, vagy ha hibakezelésre van szükséged, amikor egy tömbön iterálsz.

Reméljük, tanultál valami újat az iterációk ismétléséről ciklusokban, és örülnénk, ha megtudnád, mit gondolsz erről a cikkről (vagy az AppSignal Academy sorozat bármelyik másik cikkéről). Kérjük, ne habozzon, ossza meg velünk a véleményét, vagy ha van olyan Ruby témája, amiről szeretne többet megtudni.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.