對於redo
,我能想到的唯一用例是用於寫入套接字或從數據庫讀取數據的操作,但如果這些操作失敗一次,後續嘗試很可能也會失敗,因此對我和至於retry
我真的不能想到任何有用的情況。Ruby中重做和重試語句的目的是什麼?
這對我來說可能看起來毫無意義,因爲我不知道或者使用Ruby,但是我有朝一日想創造一種真棒語言,所以我想至少知道一些最流行語言的設計背後的推理那裏。
對於redo
,我能想到的唯一用例是用於寫入套接字或從數據庫讀取數據的操作,但如果這些操作失敗一次,後續嘗試很可能也會失敗,因此對我和至於retry
我真的不能想到任何有用的情況。Ruby中重做和重試語句的目的是什麼?
這對我來說可能看起來毫無意義,因爲我不知道或者使用Ruby,但是我有朝一日想創造一種真棒語言,所以我想至少知道一些最流行語言的設計背後的推理那裏。
這個想法是,你在致電redo
或retry
之前改變了一些事情,希望你所做的任何事情都能第二次發揮作用。我沒有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
使用情況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
你的說法,即「後續嘗試將最有可能也會失敗」似乎很值得商榷。在我看來,這將非常依賴於失敗的原因和原因。例如,如果您的數據庫操作文件是由其他人正在運行的查詢導致的死鎖,那麼退出並重試是完全正確的。 – 2012-04-08 16:38:07