检查一个对象是否有一个单例类

我正在用方法foo编写一个模块,它在接收者的类上调用类方法bar 。 我当前的方法是使用self.class.bar ,除非在实例类中定义类方法而不是“真实”类方法,否则它工作正常:

 module M def foo self.class.bar end end obj = Object.new class < NoMethodError: undefined method `bar' for Object:Class 

这是有道理的,因为obj.class不返回单例类。 我可以改用obj.singleton_class ,一切都会顺利进行:

 module M def foo self.singleton_class.bar end end obj = Object.new class < 42 

只有在单个类上定义方法的原因与上述相同。 更糟糕的是,它为每个接收器创建了一个新的单例类,我想避免这些类,因为这些可能是相当数量的对象。 所以相反,我想要一些方法来检索对象的单例类, 当且仅当它已经被定义时,即类型为obj.has_singleton_class ? obj.singleton_class : obj.class obj.has_singleton_class ? obj.singleton_class : obj.class 。 我找不到任何方法来执行此检查。

每个对象在Ruby中总是有一个单例类。 您使用的具体实现(MRI,YARV,Rubinius,JRuby,IronRuby,MacRuby,MagLev,MRuby等)可能会也可能不会通过不为未使用的单例类分配内存来优化内存使用,但这是私有的内部实现细节,一个不可见的透明编译器优化。 每当你去寻找一个单身人士课程时,它就会在那里。

嗯,实际上,这并不完全正确。 立即值,即Integer s, Symbol s和Float s 不能有单例类。

所以,这三个人永远不会有单身人士课程,所有其他人总是有一个单身人士课程。