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.

Lämna ett svar

Din e-postadress kommer inte publiceras.