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

Lla*_*don 6 ruby redo flow-control

唯一的使用情况下,我能想到的redo将是操作就像写一个插座或从数据库中读取,但如果失败一次,随后尝试将最有可能也失败,因此它似乎仍然有点无意义的我,为retry我无法想到任何有用的情况.

这可能对我来说似乎毫无意义,因为我不知道或使用Ruby,但我希望有一天能够创建一种非常棒的语言,所以我想至少知道一些最流行语言的设计背后的推理.

tsh*_*rif 9

这个想法是你在打电话之前改变了一些东西,redoretry希望你所做的一切都能在第二次起作用.我没有一个例子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
Run Code Online (Sandbox Code Playgroud)


ste*_*lag 7

用例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
Run Code Online (Sandbox Code Playgroud)