redoとretry
イテレート中に redo すると、現在のブロックを再実行します。
def foo puts "start.." 3.times {|i| puts "each.. #{i}" yield i } puts "end.." end # redo count = 0 foo {|i| puts "yield.. #{i}" redo if i == 1 && (count+=1) < 3 }
実行結果です。
start.. each.. 0 yield.. 0 each.. 1 yield.. 1 yield.. 1 yield.. 1 each.. 2 yield.. 2 end..
retryだと、イテレータが最初から再実行されます。
def foo puts "start.." 3.times {|i| puts "each.. #{i}" yield i } puts "end.." end # retry count = 0 foo {|i| puts "yield.. #{i}" retry if i == 1 && (count+=1) < 3 }
実行結果です。
start.. each.. 0 yield.. 0 each.. 1 yield.. 1 each.. 0 yield.. 0 each.. 1 yield.. 1 each.. 0 yield.. 0 each.. 1 yield.. 1 each.. 2 yield.. 2 end..