知道一个类是否是一个本征类

时间:2012-10-10 13:51:28

标签: ruby eigenclass

判断某个类some_class是否是某个对象的本征类的最佳方法是什么?

3 个答案:

答案 0 :(得分:4)

(在Ruby 2.0之前)如果对象true只是一个本征类,则以下表达式的计算结果为x

Class === x && x.ancestors.first != x

===等式检查断言xClass类的实例,!=不等式检查使用ancestors内省方法的事实“跳过”特征类。 对于x类的实例的对象Object(即x不是空白的平板对象),Class === x检查相当于x.is_a? Class或,在这种特殊情况下,x.instance_of? Class

从Ruby 2.0开始,上面的表达式不足以检测本征类,因为对于具有true ed模块的类,它也计算为prepend。这可以通过x.ancestors.first不是这样的前置模块的附加检查来解决,例如按Class === x.ancestors.first。另一种解决方案是按如下方式修改整个表达式:

Class === x && !x.ancestors.include?(x)

答案 1 :(得分:3)

总有蛮力:

ObjectSpace.each_object.any? {|o| some_class.equal? (class << o; self; end)}

答案 2 :(得分:2)

至少在2.1.0中,有Module.singleton_class?

Module.singleton_class?
#=> false
Module.new.singleton_class?
#=> false
Class.singleton_class?
#=> false
Class.new.singleton_class?
#=> false
Class.singleton_class
#=> #<Class:Class>
Class.singleton_class.singleton_class?
#=> true