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.