เราเคยพูดถึง keyword retry ขณะ discuss retrying after exceptions Little-known counterpart redo ทำงานคล้ายกัน แต่ re-runs loop iterations แทน whole blocks
The redo keyword
เหมือนที่เราเรียนรู้ใน Academy article ก่อนหน้า retry ให้คุณ retry code ใน block:
begin puts "Iteration" raise rescue retry endตัวอย่างนี้ print คำว่า "Iteration" ไปที่ console ก่อน raise exception Rescue block executes ซึ่งเรียก retry และเริ่ม block ใหม่จากต้นทาง นี่ทำให้โปรแกรมเรา endlessly print Iteration Keyword redo ให้คุณ achieve similar effect เมื่อใช้ loops นี่ useful ใน situations ที่คุณต้อง retry ขณะ iterating ตัวอย่าง
10.times do |i| puts "Iteration #{i}" redo if i > 2 endนี่จะ print:
$ ruby redo.rb Iteration 0 Iteration 1 Iteration 2 Iteration 3 Iteration 3 Iteration 3 ... สังเกตว่า iteration count อยู่ค่าเดิม? มัน step back execution ไปที่ start ของ loop Variant นี้ของ code ใช้ retry จะ print exact same output:
10.times do |i| begin puts "Iteration #{i}" raise if i > 2 rescue retry end endคุณสามารถใช้ redo implement retrying ใน loop ในตัวอย่างถัดไปเรามี queue ของ jobs พวกมัน either return :success หรือ :failure เรา re-run same iteration ของ loop จนกว่า job จะ succeed
[job_1, job_2, job_3, job_4].each do |job| redo unless job.call == :success endRuby 1.8
Behavior ของ retry และ redo เปลี่ยนระหว่าง Ruby 1.8 และ 1.9 พวกมันเคย restart loop's iteration แต่ทั้งคู่ในวิธีต่างกัน จาก 1.9 retry ทำงานกับ begin/rescue block เท่านั้น และ redo ทำงานภายใน loops เท่านั้น
The next keyword
ถ้าคุณอยาก move ไป next iteration ของ loop แทนที่จะ move กลับไป start ของ current iteration คุณสามารถใช้ next
10.times do |i| puts "Iteration #{i}" next if i > 2 puts "Iteration done" endนี่จะ print:
$ ruby next.rb Iteration 0 Iteration done Iteration 1 Iteration done Iteration 2 Iteration done Iteration 3 Iteration 4 ... เห็นไหม iteration counter ยังคง increment ใน most cases ใช้ next คือสิ่งที่คุณต้องการ ดู redo ถ้าคุณต้องการ loop ที่รัน exact number of times หรือต้องการ error handling เมื่อ iterating over array
หวังว่าคุณเรียนรู้อะไรใหม่เกี่ยวกับ redoing iterations ใน loops และเรายินดีรู้ความคิดเห็นของคุณเกี่ยวกับบทความนี้ (หรือ articles อื่นๆ ใน AppSignal Academy series) โปรดอย่าลังเลบอกเราว่าคุณคิดยังไง หรือถ้ามี Ruby subjects ที่อยากเรียนรู้เพิ่มเติม