2011-01-25 15 views
21

ruby​​はProc.newlambda(または1.9の->()演算子)で作成されたProcsの違いがあります。 non-lambda Procsは、ブロック引数を渡って渡された配列をスプライスします。ラムダを介して作成されたProcsはそうしない。ProcとLambdaの違い

p = Proc.new { |a,b| a + b} 
p[[1,2]] # => 3 

l = lambda { |a,b| a + b } 
l[[1,2]] # => ArgumentError: wrong number of arguments (1 for 2) 

この現象の背景にある動機について誰にも分かりませんか?

+3

あなたが既に知っているかもしれませんこれは動作しますが、これは動作します: 'l = lambda {|(a、b)| a + b}; l [[1,2]]#=> 3' – Phrogz

答えて

38

ラムダと非ラムダProc sの間には主に二つの違いがあります

  1. だけの方法と同様に、ラムダはわずか数ブロックのように、外側のメソッドから非ラムダProcの戻りのに対し、自分自身から戻ります。
  2. ラムダはメソッドと同様に厳密な引数チェックを行いますが、非ラムダProcはブロックと同様に緩やかな引数チェックを行います。

または、短く:lambdaはメソッドのように動作し、非ラムダProcはブロックのように動作します。

あなたには#2のインスタンスがあります。非ラムダProcとラムダに加えてブロックと方法で試してみましょう。 (この動作がなければ、それ収量の二要素を持つ配列をしているのでHash#eachは、使用する本当 PITAだろうが、あなたはかなり常に二つの引数としてそれを扱いたい。)

+1

迅速な対応をありがとう。 #each/#sortは、私が最初にこれをどのように見つけたかです。 Proc.newの冗長性を避けるため、次の構文を使用して終了しました。 - >((a、b)){...} – Brian

関連する問題