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

Vastaa

Sähköpostiosoitettasi ei julkaista.