Rubyのプロシージャとラムダの違いは何ですか?
概要
そして、どのような場合に、もう一方ではなく一方を使用しますか?
解決策
違いの 1 つは、引数の処理方法です。 proc {} と Proc.new {} を使用したプロシージャの作成は同等です。ただし、lambda {} を使用すると、渡された引数の数をチェックするプロシージャが得られます。 ri Kernel#lambda から:
例:
p = Proc.new {|a, b| puts a**2+b**2 } # => #<Proc:0x3c7d28@(irb):1>
p.call 1, 2 # => 5
p.call 1 # => NoMethodError: undefined method `**' for nil:NilClass
p.call 1, 2, 3 # => 5
l = lambda {|a, b| puts a**2+b**2 } # => #<Proc:0x15016c@(irb):5 (lambda)>
l.call 1, 2 # => 5
l.call 1 # => ArgumentError: wrong number of arguments (1 for 2)
l.call 1, 2, 3 # => ArgumentError: wrong number of arguments (3 for 2)
さらに、Ken が指摘しているように、ラムダ内で return を使用するとそのラムダの値が返されますが、proc 内で return を使用すると、それを囲んでいるブロックから返されます。
lambda { return :foo }.call # => :foo
return # => LocalJumpError: unexpected return
Proc.new { return :foo }.call # => LocalJumpError: unexpected return
したがって、ほとんどの簡単な用途では同じですが、厳密な引数の自動チェック (デバッグに役立つ場合もあります) が必要な場合、または return ステートメントを使用して proc の値を返す必要がある場合は、lambda を使用します。