Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

ทำซ้ำของ Ruby ลองอีกครั้งและคำหลักถัดไป

เราได้พูดคุยเกี่ยวกับ 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 ที่ต้องการเรียนรู้เพิ่มเติม