我想知道有什么方法可以检查对象的单例类是否已经创建?
例如:obj.singleton_class_defined?
对象的单例类总是被定义的。在 1.8.7 中,您可以使用singleton_methods
来查看对象是否已经具有关联的单例方法:
>> foo = ''
=> ""
>> foo.singleton_methods
=> []
1.9.2(可能还有更早的 1.9s,我不记得了)还有一个名为 的方法singleton_class
,它可以让您免于做class << self; self ; end
我们都习惯的事情:
>> foo.singleton_class #=> #<Class:#<String:0x00000100ba5648>>
编辑:
由于您使用“对象模型”标记了它,我还想推荐以下链接:
http://www.hokstad.com/ruby-object-model.html
从那里引用:
一个元类实际上是一个实际的类。它是 Class 类型的对象。元类唯一的“特殊”是它根据需要创建并插入到对象“真实”类之前的继承链中。所以在 MRI 解释器里面 object->klass 可以引用一个元类,它有一个名为“super”的指针,它指向链中的下一个类。当您在 MRI 中调用 object.class 时,解释器实际上会“跳过”元类(和模块)(如果存在)。