Computer >> Máy Tính >  >> Lập trình >> Ruby

Ruby's làm lại, thử lại và các từ khóa tiếp theo

Chúng ta đã nói về retry từ khóa trong khi thảo luận về việc thử lại sau các ngoại lệ. Đối tác ít được biết đến của nó redo hoạt động tương tự, nhưng chạy lại các lần lặp lại vòng lặp thay vì toàn bộ khối.

redo từ khóa

Như chúng ta đã tìm hiểu trong bài viết trước của Học viện, hãy retry cho phép bạn thử lại một đoạn mã trong một khối:

begin
  puts "Iteration"
  raise
rescue
  retry
end

Ví dụ này in từ "Lặp lại" vào bảng điều khiển trước khi đưa ra một ngoại lệ. Các khối cứu hộ thực thi, lệnh này gọi retry và bắt đầu khối lại từ đầu. Điều này dẫn đến chương trình của chúng tôi in liên tục Iteration . redo từ khóa cho phép bạn đạt được hiệu ứng tương tự khi sử dụng các vòng lặp. Điều này rất hữu ích trong các tình huống mà bạn cần thử lại trong khi lặp lại chẳng hạn.

10.times do |i|
  puts "Iteration #{i}"
  redo if i > 2
end

Điều này sẽ in:

$ ruby redo.rb
Iteration 0
Iteration 1
Iteration 2
Iteration 3
Iteration 3
Iteration 3
...

Để ý xem số lần lặp vẫn giữ nguyên như thế nào? Nó sẽ lùi quá trình thực thi về đầu vòng lặp. Biến thể của mã này bằng cách sử dụng retry sẽ in cùng một đầu ra:

10.times do |i|
  begin
    puts "Iteration #{i}"
    raise if i > 2
  rescue
    retry
  end
end

Bạn có thể sử dụng redo để thực hiện thử lại trong một vòng lặp. Trong ví dụ tiếp theo, chúng ta có một hàng đợi các công việc. Chúng trả về :success hoặc :failure . Chúng tôi tiếp tục chạy lại cùng một vòng lặp cho đến khi công việc thành công.

[job_1, job_2, job_3, job_4].each do |job|
  redo unless job.call == :success
end

Ruby 1.8

Hành vi retryredo đã thay đổi giữa Ruby 1.8 và 1.9. Chúng được sử dụng để khởi động lại quá trình lặp lại của vòng lặp, nhưng cả hai đều theo một cách khác nhau. Từ 1.9, retry chỉ hoạt động với begin / rescue chặn và redo chỉ hoạt động trong vòng lặp.

next từ khóa

Nếu bạn muốn chuyển sang lần lặp tiếp theo của vòng lặp, thay vì quay lại phần bắt đầu của vòng lặp hiện tại, bạn có thể sử dụng next .

10.times do |i|
  puts "Iteration #{i}"
  next if i > 2
  puts "Iteration done"
end

Điều này sẽ in:

$ ruby next.rb
Iteration 0
Iteration done
Iteration 1
Iteration done
Iteration 2
Iteration done
Iteration 3
Iteration 4
...

Xem cách bộ đếm lặp tiếp tục tăng? Trong hầu hết các trường hợp, sử dụng next là những gì bạn muốn. Nhìn vào redo nếu bạn cần một vòng lặp chạy một số lần chính xác hoặc cần xử lý lỗi khi lặp qua một mảng.

Chúng tôi hy vọng bạn đã học được điều gì đó mới về việc làm lại các lần lặp trong vòng lặp và rất muốn biết bạn nghĩ gì về bài viết này (hoặc bất kỳ bài nào khác trong loạt bài của AppSignal Academy). Vui lòng cho chúng tôi biết suy nghĩ của bạn hoặc nếu bạn có bất kỳ môn học nào về Ruby mà bạn muốn tìm hiểu thêm.