2012-12-19 43 views
25

有一些Ruby類不允許在其實例上定義單例方法。例如,Symbol爲什麼不能在符號或修訂號上定義單例方法?

var = :asymbol 

def var.hello 
    "hello" 
end 

# TypeError: can't define singleton method "hello" for Symbol 

我想這可能是所有即時數據的限制,但它似乎爲niltrue工作,false(但不FixnumBignum實例):

var = true 

def var.hello 
    "hello" 
end 

var.hello #=> "hello" 

我不明白,爲什麼,爲什麼紅寶石允許對某些類的對象,但不是別人來定義單方法。

+0

它似乎不只是'Fixnum's,但任何'數字'。 –

+0

我的直覺反應是它有些事情要做,無論上下文如何,w /類型都是相同的值。符號':fred'將始終是同一個符號對象,就像'5'一樣。不幸的是,'true'也是如此,所以它比這更深;我首先想知道各版本是否相同,然後想知道每種類型的穩定性是如何實現的。 –

+0

爲[對象#singleton_class](http://ruby-doc.org/core-2.3.0/Object.html#method-i-singleton_class)狀態,「如果接收機]'obj'是該文檔'nil' ,'true'或'false'分別返回'NilClass','TrueClass'或'FalseClass',如果'obj'是'Fixnum'或'Symbol',則會引發TypeError。正如@Andrew所指出的,然而,沒有數值可以有一個單獨的類。 'nil','true'和'false'具有單例類(例如'class << false; puts self; end#=> FalseClass'),但由於這些類只有一個實例,所以沒有必要區分類和單例類。 –

回答

20

該公司與一家名叫由松本行弘描述here「立即值」的概念做。

事實上,沒有什麼直接的值應該允許單方法。然而,在truefalse,並且nil的情況下,其實有單類,備份這些值(或值實際上是單例類 - 我不知道這個)。因此,您可以將singleton實例添加到支持類中,該支持類表現爲它本身的價值。數字和符號實例不是單身(顯然),並且無處可以持有單身方法。

+0

嗯,是'真的','假的',和'零'真的不再是立竿見影的價值?你有參考嗎? –

+1

看起來它們[確實是即時值](http://www.ruby-doc.org/core-1.9.3/ObjectSpace.html#each_object-method)。實際區別如上所述,請參閱更新。 – PinnyM

相關問題