0

我想知道有什么方法可以检查对象的单例类是否已经创建?

例如:obj.singleton_class_defined?

4

1 回答 1

3

对象的单例类总是被定义的。在 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 时,解释器实际上会“跳过”元类(和模块)(如果存在)。

于 2011-01-04T11:03:51.207 回答