对于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