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.