我能想到的唯一用例redo
是诸如写入套接字或从数据库读取之类的操作,但如果这些操作失败一次,后续尝试很可能也会失败,所以这对我来说仍然有点毫无意义,至于retry
我真的想不出任何有用的情况。
这对我来说似乎毫无意义,因为我不知道或不使用 Ruby,但我渴望有朝一日创造一门很棒的语言,所以我想至少知道一些最流行的语言的设计背后的原因。
我能想到的唯一用例redo
是诸如写入套接字或从数据库读取之类的操作,但如果这些操作失败一次,后续尝试很可能也会失败,所以这对我来说仍然有点毫无意义,至于retry
我真的想不出任何有用的情况。
这对我来说似乎毫无意义,因为我不知道或不使用 Ruby,但我渴望有朝一日创造一门很棒的语言,所以我想至少知道一些最流行的语言的设计背后的原因。
这个想法是你在调用redo
or之前改变一些东西retry
,希望你所做的任何事情都会在第二次起作用。我没有 的示例redo
,但我们retry
在我正在处理的应用程序中找到了 的用途。基本上,如果您有一些代码可能由于外部原因(例如网络)而失败,但是每次运行代码时执行前置条件检查成本太高,您可以retry
在一个begin...rescue
块中使用。不确定这是否清楚,所以我将直接进入示例。
基本上,我们有一些代码可以使用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