2012-04-08 61 views
5

對於redo,我能想到的唯一用例是用於寫入套接字或從數據庫讀取數據的操作,但如果這些操作失敗一次,後續嘗試很可能也會失敗,因此對我和至於retry我真的不能想到任何有用的情況。Ruby中重做和重試語句的目的是什麼?

這對我來說可能看起來毫無意義,因爲我不知道或者使用Ruby,但是我有朝一日想創造一種真棒語言,所以我想至少知道一些最流行語言的設計背後的推理那裏。

+0

你的說法,即「後續嘗試將最有可能也會失敗」似乎很值得商榷。在我看來,這將非常依賴於失敗的原因和原因。例如,如果您的數據庫操作文件是由其他人正在運行的查詢導致的死鎖,那麼退出並重試是完全正確的。 – 2012-04-08 16:38:07

回答

8

這個想法是,你在致電redoretry之前改變了一些事情,希望你所做的任何事情都能第二次發揮作用。我沒有redo的示例,但在我正在處理的應用程序中找到了retry的用途。基本上,如果你有一些可能由於某些外部因素(例如網絡)而失敗的代碼,但是如果每次運行代碼時執行前提條件檢查都會太昂貴,則可以在begin...rescue塊中使用retry。不知道這是否清楚,所以我會接受這個例子。

基本上,我們有一些代碼使用Net:SFTP來訪問遠程目錄。目錄應存在,但在某些特殊情況下,它尚未制定。如果它不在,我們想嘗試一次。但是執行網絡訪問來檢查每次存在目錄是否太昂貴,特別是因爲它只在特殊情況下才會出現。所以,我們做如下:

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

使用情況redo可以是用戶輸入檢查:

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