Ruby 中重做和重试语句的目的是什么?



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

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

这个想法是你在打电话之前改变一些东西 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

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

最新更新