ruby 1.9 での話。
proc や lambda などの意味の違いはしばしば話題になってるのを見かけますが、僕はやっぱりさっぱりわかってません (そしてろくにわかろうともしていない) 。とりあえず挙動が異なる例を一組見つけました。
$ ./ruby -e 'set_trace_func(proc { })' $ ./ruby -e 'set_trace_func(lambda { })' : -- control frame ---------- c:0001 p:---- s:0001 b:-001 l:000000 d:000000 ------ --------------------------- -- backtrace of native function call (Use addr2line) -- 0x80d9a55 0x80f2990 0x80b2740 0xffffe420 0x805f0d0 0x80daf65 0x80dc2e9 0x80dc337 0x80d8c27 0x805997f 0x8059e36 0x805a9cc 0x805cc20 0x805d1ec 0x805d589 0x805d6d1 0x805d721 0x8056d7f 0xb7da0ea8 0x8056cb1 ------------------------------------------------------- [BUG] Segmentation fault ruby 1.9.0 (2007-06-21) [i686-linux] アボートしました
set_trace_func がブロックでなく Proc オブジェクトを受け取るのは、何か深ーい事情があるのかなぁ。それとも単に使いにくくしてるだけ?
それにしても set_trace_func はパカスカ落ちますね。最近変更でもあったのかな。落ちる理由は全部同じ?(自分で追う気無し)
$ ./ruby -e 'set_trace_func(proc { throw :tag })' (略) [BUG] Segmentation fault ruby 1.9.0 (2007-06-21) [i686-linux] アボートしました $ ./ruby -e 'set_trace_func(proc { redo })' (略) [BUG] Segmentation fault ruby 1.9.0 (2007-06-21) [i686-linux] アボートしました $ ./ruby -e 'set_trace_func(proc { f = Fiber.new { } }); f.yield' (略) [BUG] Segmentation fault ruby 1.9.0 (2007-06-21) [i686-linux] アボートしました $ ./ruby -e 'set_trace_func(proc { c = callcc {|c| c } }); c.call' (略) [BUG] Segmentation fault ruby 1.9.0 (2007-06-21) [i686-linux] アボートしました $ ./ruby -e 'set_trace_func(proc { t = Thread.new { } }); t.join' (略) [BUG] Segmentation fault ruby 1.9.0 (2007-06-21) [i686-linux] アボートしました $ ./ruby -e 'set_trace_func(proc { q = proc { } }); q.call' (略) [BUG] Segmentation fault ruby 1.9.0 (2007-06-21) [i686-linux] アボートしました