ので、遊びで Ruby で実装してみました。each_with_proc(pc, *args) で、ふつうの each のループが終ったあとに proc オブジェクト pc が pc.call(*args) されます。ブロックから break で抜けた場合は proc は呼ばれません。
module Enumerable def each_with_proc(pc, *args) each {|i| yield(i)} pc.call(*args) end end ar = [] 4.times {ar << rand(10)} pc = proc {puts "Nyao, hit!"} ar.each_with_proc(pc) do |i| puts i break if i < 3 end
結果例。
7 8 1 # break で抜けたので proc は呼ばれない
6 5 3 6 Nyao, hit! # proc は呼ばれる
proc を先に指定しないといけないのが使いにくいですかね。
実際は throw 〜 catch するか、lambda と return を使ってこんな風にするか。
ar = [] 4.times {ar << rand(10)} ->{ ar.each do |i| puts i return if i < 3 end puts "Nyao, hit!" }.call
あんまりスッキリしていないですね。わかりにくい。