Olemme puhuneet avainsanasta retry
keskustellessamme poikkeusten jälkeisestä uudelleen yrittämisestä. Sen vähän tunnettu vastine redo
toimii samalla tavalla, mutta se toistaa silmukan iteraatiot kokonaisten lohkojen sijasta.
Avainsana redo
Kuten opimme edellisessä Academy-artikkelissa, retry
:n avulla voit kokeilla koodin osaa lohkossa uudelleen:
1 2 3 4 5 6 |
begin puts "Iteration" raise rescue retry end |
Tässä esimerkissä tulostuu konsoliin sana ”Iteraatio”, ennen kuin se aiheuttaa poikkeuksen. Pelastuslohko suoritetaan, mikä kutsuu retry
ja aloittaa lohkon uudelleen alusta. Tämä johtaa siihen, että ohjelmamme tulostaa loputtomasti Iteration
. Avainsanan redo
avulla voit saavuttaa samanlaisen vaikutuksen, kun käytät silmukoita. Tämä on hyödyllistä esimerkiksi tilanteissa, joissa täytyy yrittää uudelleen iteroinnin aikana.
1 2 3 4 |
10.times do |i| puts "Iteration #{i}" redo if i > 2 end |
Tämä tulostaa:
1 2 3 4 5 6 7 8 |
$ ruby redo.rb Iteration 0 Iteration 1 Iteration 2 Iteration 3 Iteration 3 Iteration 3 ... |
Huomaa, että iteraatioiden määrä pysyy samana? Se askeltaa suorituksen takaisin silmukan alkuun. Tämä koodin muunnos, jossa käytetään retry
, tulostaa täsmälleen saman tulosteen:
1 2 3 4 5 6 7 8 |
10.times do |i| begin puts "Iteration #{i}" raise if i > 2 rescue retry end end |
Voit käyttää redo
:tä toteuttaaksesi silmukan uudelleen yrittämisen. Seuraavassa esimerkissä meillä on työjono. Ne palauttavat joko :success
tai :failure
. Jatkamme saman silmukan iteraation suorittamista uudelleen, kunnes työ onnistuu.
1 2 3 |
.each do |job| redo unless job.call == :success end |
Ruby 1.8
Käyttäytyminen retry
ja redo
muuttui Ruby 1.8:n ja 1.9:n välillä. Ennen ne käynnistivät silmukan iteraation uudelleen, mutta molemmat eri tavalla. 1.9:stä lähtien retry
toimii vain begin
/rescue
-lohkon kanssa ja redo
toimii vain silmukoiden sisällä.
The next-avainsana
Jos haluat siirtyä silmukan seuraavaan iteraatioon sen sijaan, että siirtyisit takaisin nykyisen iteraation alkuun, voit käyttää next
.
1 2 3 4 5 |
10.times do |i| puts "Iteration #{i}" next if i > 2 puts "Iteration done" end |
Tämä tulostaa:
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 ... |
Näetkö, miten iteraatiolaskuri kasvaa jatkuvasti? Useimmissa tapauksissa next
:n käyttö on se, mitä haluat. Katso redo
, jos tarvitset silmukan, joka suoritetaan tarkan määrän kertoja, tai jos tarvitset virheenkäsittelyä, kun iteroit joukon yli.
Toivomme, että opit jotakin uutta iteraatioiden uusimisesta silmukoissa, ja ilahtuisimme, jos tietäisit, mitä mieltä olit tästä artikkelista (tai mistä tahansa muusta AppSignal Academy -sarjan artikkelista). Älä epäröi kertoa meille, mitä mieltä olet, tai jos sinulla on jokin Ruby-aihe, josta haluaisit oppia lisää.