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