2014-01-19 29 views
3

lambda被稱爲lambda而proc被稱爲proc的原因是什麼?
公平我記得這兩個都是匿名函數......這就是與Lambdas相似之處的結局。他們沒有從Haskell那裏獲得像lambda一樣的一個參數。Lambda和proc的名字

爲什麼一個被稱爲lambda的地方都可以被稱爲lambda?
爲什麼有人用名稱「proc」命名一個,「lambda」命名爲第二個?

ps。他們都在一個班級,Proc。有方法lambda?,顯示它是否爲lambda

+0

我一直在問同樣的各種問題在我採訪的一個,但我不能」 t答案。今天我會從那裏學習它。感謝把它帶到這裏。 :) +1 –

+0

重複? http://stackoverflow.com/questions/7043181/ruby-lambda-vs-proc-new –

+0

@TonyHopkinson不,它不是...我認爲,至少你提到的那個.. –

回答

2

在ruby中,lambda是一種特殊的Proc對象,其行爲模仿一種方法。特別是,它會尊重arity:如果你給它錯誤的參數數量,它會吐出一個錯誤。

爲它們的區別五顏六色的例子看到這個答案(對無關的問題):

Why does Hash#select and Hash#reject pass a key to a unary block?

回覆評論:蘭巴和PROC兩個產品一個Proc對象。唯一的區別是上面提到的arity的行爲,以及return語句會發生什麼(請參閱問題評論中的相關鏈接)。

至於他們爲什麼這樣命名,看起來沒有比Matz的選擇imo更進一步:這是最自然的。他在採訪中定義了他的意思:

每個人都有自己的背景。有人可能來自Python,其他人可能來自Perl,他們可能會對該語言的不同方面感到驚訝。然後他們走到我面​​前說:'我對這種語言的這種特徵感到驚訝,所以Ruby違反了最不讓人驚訝的原則。「等待。等待。最小驚喜的原則並不僅限於你。最少突擊的原則意味着最少的原則我的的驚喜。這意味着在你學習Ruby很好之後,最不感到驚訝的原則。例如,在我開始設計Ruby之前,我是一名C++程序員。我用C++專門編程了兩三年。經過兩年的C++編程,我仍然感到驚訝。

http://en.wikipedia.org/wiki/Ruby_(programming_language)#Philosophy

有鑑於此,注意拉姆達的行爲非常像的方法,並在這方面有資格作爲(匿名)功能。而proc沒有。命名這些「lambda」中的第一個似乎是一個自然的選擇(無論如何,對我來說),而第二個並不是由於關於arity和return語句的區別。

+1

它並不能解釋爲什麼lambda是lambda,爲什麼proc是proc等。 –

+0

@DarekNędza:see edit。 –

+0

不相信那個引用證明了任何東西,超出了Humpty Dumpty的理由:「當我使用一個詞時,它意味着我選擇它的意思 - 既不多也不少。」 –

0

lambda被稱爲lambda而proc被稱爲proc的原因是什麼?

讓我們看到呼叫發生了什麼事proc,並在紅寶石1.8 lambda。7

aa = lambda {|a| nil } 
# => #<Proc:[email protected](irb):6> 
aa.call 
# warning: multiple values for a block parameter (0 for 1) 
# => nil 

aa = proc {|a| nil } 
# => #<Proc:[email protected](irb):10> 
aa.call 
# warning: multiple values for a block parameter (0 for 1) 

正如我們可以看到,有proc,並lambda在Ruby中沒有什麼區別。我認爲proc起初出現在Ruby。因爲它只是Proc.new的別名,它創建了Proc對象。然後lambda已經添加到ruby​​,因爲Lambda是計算機編程領域中所謂的匿名函數,並且開發人員可以在語言中看到該函數類的熟知名稱。

讓我們看到,隨着運營商在1.9.1發生了:

aa = lambda {|a| nil } 
# => #<Proc:[email protected](irb):1 (lambda)> 
aa.call 
# ArgumentError: wrong number of arguments (0 for 1) 
from (irb):2:in `call' 
from (irb):2 
from /home/malo/.rvm/rubies/ruby-1.9.1-p431/bin/irb:12:in `<main>' 
aa = proc {|a| nil } 
# => #<Proc:[email protected](irb):3> 
aa.call 
# => nil 

我們可以看到,在紅寶石1.9.2(我猜的,因爲紅寶石1.9)加屬性lambda into Proc實例說anonymouns函數不會接受錯誤的參數量。因此,將參數傳遞給需要引起ArgumentError例外。雖然proc對象所需的自變量通過靜靜地丟棄不必要的參數。

當你從1.9.1加入->作爲別名argumentless lambda操作者知道:

aa = -> { nil } 
# => #<Proc:[email protected](irb):1 (lambda)> 
aa = -> {|a| nil } 
# SyntaxError: (irb):2: syntax error, unexpected '|' 
    aa = -> {|a| nil } 
      ^
+0

@ Darek-Nedza有沒有幫助? –