lambdaとProcは動作が微妙に異なる

これは知らないと意外とハマるかも。


実行環境はこんな感じ。

$ ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux]


以下のプログラムを実行する。

def hoge
  lam = lambda{return 3}
  prc = Proc.new{return 4}

  p lam.call
  p "lambda called"
  p prc.call
  p "prc called"
end

p hoge
p "hoge called"


以下のような動作になる。

"3"
"lambda called"
"4"
"hoge called"

つまり「p "proc called"」の行が呼ばれない。


lambdaから制御が戻ると特定の値を返す。
しかしprocから制御が戻ると、呼び出し元のメソッド(ここではhoge)から制御を戻そうとする。
それが不可能である場合にはLocalJumpErrorになるらしい。
つまり、Procの方はp.callからhogeの制御を戻すので「p "proc called"」が呼ばれない。


ちなみに普段はSchemeの影響でlambdaを使ってる。
しかし何故こんな仕様が…。