2009-05-29 52 views
27

Ruby Programming Language,第6章(第二段)他們的狀態:紅寶石功能VS方法

許多語言 功能,這些功能沒有關聯 對象和方法,這是在接收器上調用 區分目的。因爲Ruby是純粹面向對象的語言,所有的 方法都是真正的方法,並且與至少一個對象相關聯的是 。

然後在第6段落的中間:

兩個特效和lambda表達式是調用的 對象上的功能 ,而不是方法。

我對這些說法有些困惑。 Ruby是否是真正的純OO,因此沒有與對象關聯的函數(如果這是純OO的有效定義),或者是與Proc對象關聯的procs/lambdas? Ruby中的函數和方法有什麼區別?

任何幫助解析和理解這將不勝感激。

回答

21

lambda在Ruby中是類Proc的對象。 Proc對象不屬於任何對象。它們被調用時不會將它們綁定到對象。

方法是MethodUnboundMethod的對象,具體取決於它們是綁定還是非綁定。請參閱說明here。未綁定的方法在綁定到對象之前不能被調用。

lambda{|x| x}.class  # => Proc 
lambda{|x| x}.call(123) # => 123 

class Foo 
    def bar(baz) 
    baz 
    end 
end 

puts Foo.new.method(:bar).class  # => Method 
puts Foo.new.method(:bar).call(123) # => 123 

puts Foo.instance_method(:bar).class  # => UnboundMethod 
puts Foo.instance_method(:bar).call(123) # => throws an exception 

可以bindUnboundMethod一個對象,然後調用它。但是根本不可能將bind a Proc轉換爲對象。然而,對象可以捕獲周圍範圍內的局部變量,成爲閉包。

5

Procs和lambdas本身都是對象,call方法實際上調用與proc(或lambda)關聯的塊。但是,Ruby不提供對call的明確調用,就會提供一些語法糖來調用它們。

+0

是的,proc和lambdas都是Proc對象,但它們是什麼意思是「函數而不是方法」。有什麼區別? – 2009-05-29 22:48:40