Python の for else って地味に便利と Rubyist が思う

ので、遊びで 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

あんまりスッキリしていないですね。わかりにくい。