2009-08-07 55 views
21

我有幾個關於Ruby的方法,過程和塊的問題讓我覺得很奇怪。它們與語法或功能沒有太大關係,而是作爲決策背後的邏輯。Ruby方法,Proc和塊混淆

問題1:

爲什麼該塊可以被傳遞到方法(例如每個),但它們不能被分配給一個變量?

我知道你可以在程序中傳遞它們,即p = Proc.new {...}(使用&p訪問),但是讓程序員通過這些方法是沒有什麼意義的。

問題2:

爲什麼有方法和程序之間的區別?

舉例來說,我可以完成以下兩種方式定義一個函數,並調用該函數的任務:

def square(x) 
    x**2 
end 

square(3) 
=> 9 

square = lambda {|x| x**2} 
square.call(3) 
=> 9 

爲什麼分化?例如在Python中,以標準方式定義一個函數,並由square = lambda x: x**2完成創建函數並將其分配給square的相同任務。

回答

20

問題1:塊不是對象,它們是句法結構;這就是爲什麼他們不能被分配給一個變量。這是爲對象保留的特權。

問題2:方法不是對象,所以它們不能接收消息。相反,procs和lambdas是對象,因此它們不能像方法那樣被調用,但必須接收一條消息,告訴它們根據消息傳遞的參數返回一個值。

Procs和Lambdas是對象,因此它們可以接收call消息並分配給名稱。總而言之,它是一個使特效和lambda表現出奇怪的行爲的對象。方法和塊不是對象,不共享該行爲。

+5

紅寶石聲稱一切都是對象。塊應該是對象,以便與之匹配,並且它們可以作爲參數傳遞,所以它們在某些方面明確地扮演着對象的角色。 – rpjohnst 2009-08-07 17:58:18

+6

可以通過創建一個對象來表示塊,proc或lambda,使塊可以像對象一樣工作。沒有這個設備,它們只是語法結構。 – Pinochle 2009-08-07 18:03:33

+0

有塊對象 - 這就是lambda {whatever}的目的。 – Chuck 2009-08-07 18:04:16

4

方法是方法 - 也就是說,它們是對象可以響應消息而採取的操作。他們不是功能。

塊關閉 - 它們是關閉封閉範圍的函數。它們在概念上不屬於「屬於」給定的對象。

在某些語言中,方法僅僅是一個對象成員的函數,但Ruby不會以這種方式查看它們。從自己的對象中分離出一種方法更像是手術而不是簡單的分配。 Ruby從現代OO的granddaddy Smalltalk中獲得了面向對象的模型。

5

在一定程度上至少,方法對象:

class ABC 
    def some_method 
    end 
end 
ABC.instance_method(:some_method) #=> #<UnboundMethod: ABC#some_method> 

進一步說,有一個內置類:方法,如記錄here

也是這個參見:http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls

隨意<bseg>,它確實相當似乎證明了一切都是一個對象的事情。在這個特殊情況下,它似乎需要多一點挖掘才能看到。

(我必須作出努力,以更好地理解這種:我開始認爲這是獲得一個更深入的瞭解至關重要。)

+0

方法似乎把它們的對象當作'Proc'的實例。在'Method'的'ri'文檔中,'method'這個詞在解釋中沒有使用,但'proc'是。這兩個類接收相同的消息,但不同之處在於它們是如何被調用的以及事實上方法是在另一個對象的名稱空間內定義的,其中proc需要接收要調用和存在的調用方法(persist,as我之前說過)獨立於其他物體。 – Pinochle 2009-08-07 18:48:25

+0

啊,另一個區別是......'方法'沒有收到'新'消息,其中'Proc'做。如果方法是對象,它們不是完全意義上的對象('完整'意思是我們習慣在對象中看到的所有特徵)。 – Pinochle 2009-08-07 18:51:28

+0

這個wikibooks鏈接很有幫助。謝謝。 – David 2009-08-07 18:54:40