Ruby 1.9上`retry`的用法是什么?

时间:2013-02-19 06:57:45

标签: ruby

在Ruby 1.8中,retry可以像:

一样使用
for i in 0..4
  puts i
  retry if i == 4
end

但是在Ruby 1.9中,它会抛出一个错误:重试无效,Ruby 1.9中retry的用法是什么?我在http://www.ruby-doc.org =(

)上找不到retry

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

首先,我认为重试仅适用于开始结束块(或方法定义中的隐式开始结束块)。意思是它会跳回去开始。不是循环的开始。 此外,从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

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

0
1
2
3
4
4 # => infinite loop

答案 2 :(得分:0)

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

您可以使用延续来复制旧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