Proc.newとproc、lambdaとのセマンティクスの違い

Proc.newとproc、lambdaでは、returnの扱いが違います。おー、これはサプライズです。まぁProc.newはまず使わないからあまり影響はないのですが。

def foo
  Proc.new { return 'Proc.new' }[]
  return 'foo'
end

def bar
  proc { return 'proc' }[]
  return 'bar'
end

def baz
  lambda { return 'lambda' }[]
  return 'baz'
end

p foo # => "Proc.new" … 呼び出したメソッドからかえっている。
p bar # => "bar"      … クロージャからかえるだけ。
p baz # => "baz"      … クロージャからかえるだけ。

参照: クロージャ - Wikipedia