判断某个类some_class
是否是某个对象的本征类的最佳方法是什么?
答案 0 :(得分:4)
(在Ruby 2.0之前)如果对象true
只是一个本征类,则以下表达式的计算结果为x
:
Class === x && x.ancestors.first != x
===
等式检查断言x
是Class
类的实例,!=
不等式检查使用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