咳といいます。

たすけてください。ruby-1.6.2です。

Procの中でbreakやretryを使うと LocalJumpError 例外が発生して
"break from proc-closure" とか "retry from proc-closure" とか
戻っていたと思うのですが break で例外が発生してくれません。

1.4系だと動作した記憶があるのですが…

----
proc = Proc.new do |n|
  p n
  break if n == :break
  retry if n == :retry
end

begin
  proc.call(:retry)
rescue
  p $! #=> #<LocalJumpError: retry from proc-closure>
end

begin
  proc.call(:break)
rescue 
  p $! #=> ??
end
----

それからブロック付きメソッドにブロックを書いてもProcを渡しても
ほぼ同じように動くとおもっていたのですが、勘違いでしょうか ?
(自信ない…)

----
(1..5).each do |n|
  puts n
  break if n == 3
end
puts 'done'

proc = Proc.new do |n|
  puts n
  break if n == 3   # ←を retry にすると LocalJumpError
end

(1..5).each(&proc)
puts 'done'
----
1
2
3
done
1
2
3
a.rb:10: unexpected break
----

a.rb:10: unexpected break" というのはなんでしょう? 例外ではない ??



= 質問のまとめ。

ProcがretryやbreakしたことをLocalJumpErrorで捕まえることで
dRubyのブロック付きメソッドを実現していました。

1.6.2でProcがbreakしたことを知る方法はありますか?
(retryはLocalJumpErrorが発生するので知ることができました。)