2011-01-25 31 views
21

Ruby通過Proc.newlambda(或在1.9中的->()運算符)創建的Procs之間存在差異。看來non-lambda Procs將會在塊參數中傳入一個數組,通過lambda創建的代碼不會。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 2011-01-26 05:32:54

回答

38

有lambda表達式和非拉姆達Proc s的兩個主要區別:

  1. 就像方法,從lambda表達式返回本身,而非拉姆達Proc■從封閉方法的返回,就像塊。
  2. 就像方法一樣,lambda具有嚴格的參數檢查,而非lambda Proc有鬆散的參數檢查,就像塊一樣。

或者,簡而言之:lambda表現得像方法一樣,非lambda Proc表現得像塊一樣。

你所看到的有一個#2的實例。除了非lambda表達式Proc和lambda以外,還可以嘗試使用塊和方法,您會看到。 (如果沒有這種行爲,Hash#each將是一個真正 PITA使用,因爲它確實產量有兩個元素的數組,但你幾乎總是希望把它當作兩個參數。)

+1

感謝您的快速響應。 #每個/ #sort都是我在第一時間遇到的。我最終使用以下語法來避免Proc.new的冗長: - >((a,b)){...} – Brian 2011-01-26 00:39:05