2012-04-08 29 views
5

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ì?

+0

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. –

Trả lời

8

Ý 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 
6

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 
Các vấn đề liên quan