Ruby の proc と lambda の違い
Ruby でブロックをオブジェクトとして扱いたい場合、proc
や lambda
を利用する事ができます。
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