Ruby の proc と lambda の違い

Ruby でブロックをオブジェクトとして扱いたい場合、proclambda を利用する事ができます。

proc = proc { |a, b|
    a + b
}
proc.call 1, 2
# => 3


lam = lambda { |a, b|
    a - b
}
lam.call 1, 2
# => -1

この 2つは書き方は似ていますが、挙動が少し異なります。

引数が異なる場合のエラーの有無

lambda はブロックの引数が異なるとエラーになりますが、proc の場合はエラーになりません。

proc = proc { |a, b|
    a + b
}
# エラーにならない
# 第三引数以降は無視される
proc.call 1, 2, 3 # proc.call 1, 2 と同等
# 引数が足りない場合は nil が渡される
proc.call 1 # proc.call 1, nil と同等


lam = lambda { |a, b|
    a - b
}
# エラー
# wrong number of arguments (3 for 2) (ArgumentError)
lam.call 1, 2, 3

return の扱い

proc 内で return した場合は通常のブロックと同様に評価したメソッドから抜けますが、lambda の場合はメソッドからは抜けません。

def proc_method
    proc = proc {
        return -1
    }
    proc.call
    return 1
end

proc_method
# => -1

def lambda_method
    lam = lambda {
        return -1
    }
    lam.call
    return 1
end

lambda_method
# => 1

細かい違いですが、挙動が異なるので覚えておきたいです。

参照

http://docs.ruby-lang.org/ja/2.1.0/class/Proc.html#lambda_proc http://qiita.com/ryo-ma/items/24c46592b45775e8644d