Trường hợp sử dụng duy nhất mà tôi có thể nghĩ đến cho redo
là dành cho các hoạt động như ghi vào ổ cắm hoặc đọc từ cơ sở dữ liệu, nhưng nếu những lỗi này thất bại một lần, các lần thử tiếp theo sẽ có nhiều khả năng không thành công. như đối với retry
Tôi thực sự không thể nghĩ ra bất kỳ trường hợp nào sẽ hữu ích. Điều này chỉ có vẻ vô nghĩa với tôi vì tôi không biết hoặc sử dụng Ruby, nhưng tôi mong muốn tạo ra một ngôn ngữ tuyệt vời một ngày vì vậy tôi muốn ít nhất là biết lý do đằng sau thiết kế của một số ngôn ngữ phổ biến nhất ra đó.Mục đích của làm lại và thử lại các câu lệnh trong Ruby là gì?
Trả lời
Ý tưởng là bạn thay đổi một cái gì đó trước khi gọi redo
hoặc retry
, với hy vọng rằng bất cứ điều gì bạn đang làm sẽ làm việc lần thứ hai. Tôi không có ví dụ cho redo
, nhưng chúng tôi đã tìm thấy sử dụng cho retry
trong ứng dụng tôi đang làm việc. Về cơ bản, nếu bạn có một chút mã có thể không thành công do một cái gì đó bên ngoài (ví dụ: mạng), nhưng thực hiện kiểm tra điều kiện tiên quyết mỗi khi bạn chạy mã sẽ quá đắt, bạn có thể sử dụng retry
trong khối begin...rescue
. Không chắc chắn nếu điều đó là rõ ràng, vì vậy tôi sẽ nhận được quyền để ví dụ.
Về cơ bản, chúng tôi có một số mã truy cập thư mục từ xa bằng cách sử dụng Net:SFTP
. Các thư mục nên tồn tại, nhưng trong một số trường hợp đặc biệt nó sẽ không được thực hiện được nêu ra. Nếu nó không có, chúng tôi muốn thử một lần để làm cho nó. Nhưng thực hiện truy cập mạng để kiểm tra xem thư mục tồn tại mỗi lần sẽ là quá đắt, đặc biệt là vì nó chỉ trong trường hợp đặc biệt mà nó sẽ không có ở đó. Vì vậy, chúng tôi làm điều đó như sau:
tried_mkdir = false
begin
# Attempt to access remote directory
...
rescue Net::SFTP::StatusException
raise if tried_mkdir
tried_mkdir = true
# Attempt to make the remote directory
...
retry
end
Sử dụng trường hợp cho redo
có thể kiểm tra người dùng nhập vào:
nums = Array.new(5){[rand(1..9), rand(1..9)]}
nums.each do |num1, num2|
print "What is #{num1} + #{num2}: "
redo unless gets.to_i == num1 + num2
end
- 1. Mục đích của lệnh "PAUSE" trong x86 là gì?
- 2. Mục đích chung Hãy thử và Thử lại với Thời gian chờ trong C#?
- 3. Mục đích của Rake là gì?
- 4. Mục đích của khối thử chức năng là gì?
- 5. của Ruby cứu và thử lại mã cụ thể khối
- 6. Mục đích của character_set_connection là gì?
- 7. mục đích là gì? "::" trong
- 8. Mục đích của 'var' là gì?
- 9. Mục đích của startManagingCursor là gì?
- 10. các ràng buộc IIS là gì và mục đích của chúng là gì?
- 11. Mục đích của config.assets.precompile là gì?
- 12. Mục đích của các khung nhìn trong SQL là gì?
- 13. Mục đích của __str__ và __repr__ là gì?
- 14. Mục đích của ~ 'hoặc' ~ trong Clojure là gì?
- 15. Mục đích của UIWindow là gì?
- 16. Sự khác biệt của câu lệnh và biểu thức trong Ruby là gì?
- 17. Mục đích của toán tử xóa trong Javascript là gì?
- 18. Mục đích của BFS và DFS là gì?
- 19. Mục đích của tệp vshost.exe là gì?
- 20. Mục đích của is_uploaded_file() là gì?
- 21. Mục đích của __cxa_pure_virtual là gì?
- 22. Mục đích của Parse Vexing là gì?
- 23. Mục đích của tệp .edmx là gì?
- 24. Mục đích của thư mục buildSrc của gradle là gì?
- 25. Mục đích của tệp pdb là gì?
- 26. Mục đích của IntentSender là gì?
- 27. Mục đích của requestWindowFeature() là gì?
- 28. Mục đích của ldexp là gì?
- 29. Mục đích của nguyên mẫu là gì?
- 30. Mục đích của HttpHeaders.TryAddWithoutValidation là gì?
khẳng định của bạn rằng "nỗ lực tiếp theo sẽ rất có thể cũng thất bại" có vẻ như rất gây tranh cãi. Dường như với tôi rằng điều này sẽ rất phụ thuộc vào những gì đã thất bại và tại sao. Ví dụ, nếu lý do tại sao tệp hoạt động cơ sở dữ liệu của bạn là một bế tắc do truy vấn mà người khác đang chạy thì việc sao lưu và thử lại chính xác là điều đúng đắn cần làm. –