【问题标题】:What is the usage of `retry` on Ruby 1.9?Ruby 1.9 上的“重试”有什么用?
【发布时间】:2013-02-03 18:49:39
【问题描述】:

在 Ruby 1.8 中,retry 可以像这样使用:

for i in 0..4
  puts i
  retry if i == 4
end

但是在 Ruby 1.9 中,它会抛出一个错误:Invalid retry,retry 在 Ruby 1.9 中的用法是什么?我在http://www.ruby-doc.org 上找不到retry =(

【问题讨论】:

标签: ruby


【解决方案1】:

用于重试失败的操作(当你捕获异常时)

n = 0
begin
  puts 'Trying to do something'
  raise 'oops'
rescue => ex
  puts ex
  n += 1
  retry if n < 3
end
puts "Ok, I give up"


# >> Trying to do something
# >> oops
# >> Trying to do something
# >> oops
# >> Trying to do something
# >> oops
# >> Ok, I give up

【讨论】:

【解决方案2】:

首先,我相信重试只会在开始结束块(或方法定义中的隐式开始结束块)中起作用。这意味着它会跳回开始。不是循环的开始。 同样从 1.9 开始,重试仅在救援中有效。

begin # should jump here
  for i in 4..0
    puts i
    4 / i
  end
rescue
  retry
end

我认为您正在寻找的是重做。

for i in 0..4
  puts i
  redo if i == 4
end

请注意,redo 将再次执行最后一次迭代。 结果是:

0
1
2
3
4
4 # => infinite loop

【讨论】:

    【解决方案3】:

    Ruby 1.9 仅在 begin rescue 子句中支持 retry

    您可以使用延续来复制旧 retry 的行为

    require 'continuation'
    
    def with_retry
      loop { callcc { |cc| def cc.retry; call; end; yield cc; return }}
    end
    
    with_retry do |cc|
      for n in 1..4
        puts n
        cc.retry if n == 4
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 2011-06-28
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多