เราได้พูดคุยเกี่ยวกับ retry
คีย์เวิร์ดขณะพูดถึงการลองใหม่หลังจากข้อยกเว้น คู่หูที่ไม่ค่อยมีใครรู้จัก redo
ทำงานเหมือนกัน แต่จะรันการวนซ้ำแบบวนซ้ำแทนที่จะเป็นทั้งบล็อก
The redo
คีย์เวิร์ด
ดังที่เราได้เรียนรู้ในบทความของ Academy ก่อนหน้านี้ retry
ให้คุณลองโค้ดใหม่อีกครั้งในบล็อก:
begin
puts "Iteration"
raise
rescue
retry
end
ตัวอย่างนี้พิมพ์คำว่า "Iteration" ลงในคอนโซลก่อนที่จะสร้างข้อยกเว้น บล็อกกู้ภัยดำเนินการซึ่งเรียก retry
และเริ่มบล็อกอีกครั้งตั้งแต่ต้น ส่งผลให้โปรแกรมของเราพิมพ์ Iteration
. ได้ไม่รู้จบ . redo
คำหลักช่วยให้คุณบรรลุผลที่คล้ายกันเมื่อใช้ลูป สิ่งนี้มีประโยชน์ในสถานการณ์ที่คุณต้องลองอีกครั้งในขณะที่ทำซ้ำ
10.times do |i|
puts "Iteration #{i}"
redo if i > 2
end
สิ่งนี้จะพิมพ์:
$ ruby redo.rb
Iteration 0
Iteration 1
Iteration 2
Iteration 3
Iteration 3
Iteration 3
...
สังเกตว่าจำนวนการวนซ้ำยังคงเหมือนเดิมหรือไม่ มันจะย้อนกลับไปที่จุดเริ่มต้นของการวนซ้ำ รหัสตัวแปรนี้ใช้ retry
จะพิมพ์ผลลัพธ์ที่เหมือนกันทุกประการ:
10.times do |i|
begin
puts "Iteration #{i}"
raise if i > 2
rescue
retry
end
end
คุณสามารถใช้ redo
เพื่อดำเนินการลองซ้ำในลูป ในตัวอย่างต่อไป เรามีคิวงาน พวกเขาส่งคืน :success
หรือ :failure
. เราทำการวนซ้ำแบบเดิมซ้ำไปเรื่อยๆ จนกว่างานจะสำเร็จ
[job_1, job_2, job_3, job_4].each do |job|
redo unless job.call == :success
end
ทับทิม 1.8
ลักษณะการทำงานของ retry
และ redo
เปลี่ยนระหว่าง Ruby 1.8 และ 1.9 พวกเขาเคยรีสตาร์ทการวนซ้ำของลูป แต่ทั้งคู่ต่างไปจากเดิม จาก 1.9 retry
ใช้ได้เฉพาะกับ begin
/rescue
บล็อกและ redo
ใช้งานได้ภายในลูปเท่านั้น
The next
คีย์เวิร์ด
หากคุณต้องการย้ายไปยังการวนซ้ำถัดไปของลูป แทนที่จะย้ายกลับไปที่จุดเริ่มต้นของการวนซ้ำปัจจุบัน คุณสามารถใช้ next
.
10.times do |i|
puts "Iteration #{i}"
next if i > 2
puts "Iteration done"
end
สิ่งนี้จะพิมพ์:
$ ruby next.rb
Iteration 0
Iteration done
Iteration 1
Iteration done
Iteration 2
Iteration done
Iteration 3
Iteration 4
...
ดูว่าตัวนับการวนซ้ำเพิ่มขึ้นเรื่อย ๆ อย่างไร? ในกรณีส่วนใหญ่ใช้ next
คือสิ่งที่คุณต้องการ ดู redo
หากคุณต้องการลูปที่ทำงานตามจำนวนครั้งที่แน่นอนหรือต้องการการจัดการข้อผิดพลาดเมื่อวนซ้ำบนอาร์เรย์
เราหวังว่าคุณจะได้เรียนรู้สิ่งใหม่ๆ เกี่ยวกับการทำซ้ำแบบวนซ้ำ และอยากทราบว่าคุณคิดอย่างไรกับบทความนี้ (หรือบทความอื่นๆ ในซีรี่ส์ AppSignal Academy) โปรดอย่าลังเลที่จะแจ้งให้เราทราบว่าคุณคิดอย่างไร หรือหากคุณมีวิชา Ruby ที่ต้องการเรียนรู้เพิ่มเติม