2011-07-21 17 views
0

我學習Ruby單身人士和有這樣的代碼的誤解:Ruby類和對象的單身 - 可以訪問

class MyClass 
    def self.class_singleton_mymethod 
    end 
end 

class_singleton = class << MyClass 
    self 
end 

puts class_singleton.methods.grep(/mymethod/) # => [] 


obj = MyClass.new 

def obj.object_singleton_mymethod 
end 

object_singleton = class << obj 
    self 
end 

puts object_singleton.methods.grep(/mymethod/) # => class_singleton_mymethod 

爲什麼class_singleton 包含類的方法和object_singleton代替對象的單方法包含類的方法?

回答

2

我認爲你有methodsinstance_methods混淆的概念。如果您要用instance_methods替換methods的所有實例,則會看到您期望的結果。

instance_methods用於枚舉類的實例具有哪些方法。使用methods來枚舉對象具有的方法。 (Class對象是對象太,並有自己的方法,如new不在實例方法

例如,String#slice是一個實例方法。你可以在字符串調用slice實例在另一方面,String.new是在String自己的方法,你也不要稱呼字符串實例new,但你可以叫String.new(即String類對象本身)創建一個新的字符串)

+1

感謝您的明確答案! –

+0

@Vladimir:謝謝,我花了兩次嘗試才把它做好,但我很高興能有一個令我滿意的答案。 :-) –

0

我不確定我是否理解,但是您是否試圖實施Singleton設計模式?

使用它實現了燕鷗爲您Singleton Module,你只是包括它

+0

-1號辛格爾頓類在Ruby中都有。與單身模式無關。 –

+0

我試着理解爲什麼'class_singleton'(包含MyClass的Sinleton對象)裏面沒有MyClass單例方法 –

+0

他正在談論Ruby中的單例類/特徵類。該名稱有點令人困惑,但基本上,每個對象在類層次結構中的類下有一個唯一的單例類。 – Chuck