Ruby中redo和retry语句的用途是什么?

Ruby中redo和retry语句的用途是什么?,ruby,flow-control,redo,Ruby,Flow Control,Redo,对于redo我能想到的唯一用例是写入套接字或从数据库读取之类的操作,但如果这些操作失败一次,后续的尝试也很可能失败,因此对我来说似乎仍然有点毫无意义,至于retry,我真的想不出任何有用的情况 这对我来说可能只是毫无意义,因为我不知道或不使用Ruby,但我渴望有一天能创造出一种很棒的语言,所以我想至少知道一些最流行的语言设计背后的原因。这个想法是,在调用redo或retry之前,您可以更改一些内容,希望你所做的一切都能再次发挥作用。我没有关于redo的示例,但是我们在我正在开发的应用程序中发现了

对于
redo
我能想到的唯一用例是写入套接字或从数据库读取之类的操作,但如果这些操作失败一次,后续的尝试也很可能失败,因此对我来说似乎仍然有点毫无意义,至于
retry
,我真的想不出任何有用的情况


这对我来说可能只是毫无意义,因为我不知道或不使用Ruby,但我渴望有一天能创造出一种很棒的语言,所以我想至少知道一些最流行的语言设计背后的原因。

这个想法是,在调用
redo
retry
之前,您可以更改一些内容,希望你所做的一切都能再次发挥作用。我没有关于
redo
的示例,但是我们在我正在开发的应用程序中发现了
重试的用法。基本上,如果您有一些代码可能由于外部原因(例如网络)而失败,但每次运行代码时执行前提条件检查的成本太高,您可以在
开始…救援
块中使用
重试
。不确定这是否清楚,因此我将直接进入示例

基本上,我们有一些代码可以使用
Net:SFTP
访问远程目录。目录应该存在,但在某些特殊情况下,它还不会被创建。如果它不在那里,我们想尝试一次。但是每次执行网络访问来检查目录是否存在的代价太高,特别是因为只有在例外情况下它才会不存在。因此,我们的做法如下:

trued\u mkdir=false
开始
#尝试访问远程目录
...
救援网::SFTP::状态异常
如果尝试,请提高\u mkdir
已尝试\u mkdir=true
#尝试创建远程目录
...
重试
结束

重做的用例可以是用户输入检查:

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
你关于“随后的尝试很可能也会失败”的断言似乎很有争议。在我看来,这取决于失败的原因和原因。例如,如果您的数据库操作文件是由其他人正在运行的查询导致的死锁,那么退出并重试正是正确的做法。