2013-01-03 52 views
4

將下面的代碼添加到對象應該允許我檢索任何對象的單例類。訪問單例類

class Object 
    def singleton_class 
     class << self; self; end 
    end 
end 

我有一個強力球類,我實例化這種方式

puts Powerball.new.singleton_class 
puts Powerball.new.singleton_class 
puts Powerball.singleton_class 
puts Powerball.singleton_class 

它給了我這個輸出

#<Class:#<Powerball:0x007fd333040548>> 
#<Class:#<Powerball:0x007fd333040408>> 
#<Class:Powerball> 
#<Class:Powerball> 

因此,樂透類的兩個實例具有唯一的ID,而直接在類上調用singleton_class不會產生對象ID。

問題

  1. 是IDS獨一無二的,因爲每個實例有一個單獨的類?

  2. 據我所知,self內的一個類只是返回類,即類:強力球,但由於類是一個對象,不應該它也有一個ID?有沒有辦法訪問該ID?

+0

的單例類的有趣的文章可以在Devalot博客上找到,從這個答案http://stackoverflow.com/questions/13850971/why-are-symbols-in-ruby-not-thought-of-評論作爲一種類型的可變/ 13871724#13871724 – BernardK

回答

2

你必須明白單例類屬於一個實例。代碼中的前兩個單例屬於兩個不同的Powerball實例。 (是的,每個實例都有它自己的單例類 - 它被稱爲singleton因爲只有一個實例屬於它。)第三和第四個單例是相同的 - Powerball類本身的單例類,當然,在這兩種情況下都是同一個對象。

你爲什麼不嘗試自己調查:

class Kokot; end 
puts Kokot.object_id 
puts Kokot.singleton_class.object_id 

而且還用Ruby 1.9.x的,#singleton_class是一個內置的方法。