Vi har talat om nyckelordet retry
när vi diskuterade omprövning efter undantag. Dess föga kända motsvarighet redo
fungerar på liknande sätt, men kör om loop-iterationer i stället för hela block.
Nyckelordet redo
Som vi lärde oss i föregående Academy-artikel kan du med retry
försöka igen en bit kod i ett block:
1 2 3 4 5 6 |
begin puts "Iteration" raise rescue retry end |
Detta exempel skriver ut ordet ”Iteration” i konsolen innan det utlöser ett undantag. Räddningsblocket utförs, vilket anropar retry
och startar blocket från början igen. Detta resulterar i att vårt program ändlöst skriver ut Iteration
. Med nyckelordet redo
kan du uppnå en liknande effekt när du använder slingor. Detta är användbart i situationer där du till exempel behöver göra ett nytt försök medan du itererar.
1 2 3 4 |
10.times do |i| puts "Iteration #{i}" redo if i > 2 end |
Detta kommer att skriva ut:
1 2 3 4 5 6 7 8 |
$ ruby redo.rb Iteration 0 Iteration 1 Iteration 2 Iteration 3 Iteration 3 Iteration 3 ... |
Märker du hur antalet iterationer förblir detsamma? Den kommer att gå tillbaka till början av slingan. Denna variant av koden som använder retry
kommer att skriva ut exakt samma utdata:
1 2 3 4 5 6 7 8 |
10.times do |i| begin puts "Iteration #{i}" raise if i > 2 rescue retry end end |
Du kan använda redo
för att implementera retrying i en loop. I nästa exempel har vi en kö av jobb. De returnerar antingen :success
eller :failure
. Vi fortsätter att köra om samma iteration av slingan tills jobbet lyckas.
1 2 3 |
.each do |job| redo unless job.call == :success end |
Ruby 1.8
Beteendet för retry
och redo
har ändrats mellan Ruby 1.8 och 1.9. De brukade starta om loopens iteration, men båda på ett annat sätt. Från och med 1.9 fungerar retry
endast med ett begin
/rescue
-block och redo
endast inom slingor.
Nyckelordet next
Om du vill flytta till nästa iteration av slingan, i motsats till att flytta tillbaka till början av den aktuella, kan du använda next
.
1 2 3 4 5 |
10.times do |i| puts "Iteration #{i}" next if i > 2 puts "Iteration done" end |
Detta kommer att skriva ut:
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 ... |
Se hur iterationsräknaren fortsätter att öka? I de flesta fall är det lämpligt att använda next
. Titta på redo
om du behöver en slinga som körs ett exakt antal gånger eller behöver felhantering när du itererar över en array.
Vi hoppas att du lärt dig något nytt om att göra om iterationer i slingor och vill gärna veta vad du tyckte om den här artikeln (eller någon av de andra i AppSignal Academy-serien). Tveka inte att låta oss veta vad du tycker, eller om du har några Ruby-ämnen som du skulle vilja lära dig mer om.