2013-01-03 48 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是一个内置的方法。