3

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

4

3 回答 3

4

(在 Ruby 2.0 之前)以下表达式true仅在对象是特征类时才计算为 if an x

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

===等式检查断言它xClass类的一个实例,不等式!=检查使用ancestors自省方法“跳过”特征类这一事实。对于作为类x实例的对象Object(即x不是空白的 slate 对象),Class === x检查等同于,x.is_a? Class或者在这种特殊情况下,等同于x.instance_of? Class

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

Class === x && !x.ancestors.include?(x)
于 2012-10-14T07:10:31.413 回答
3

总是有蛮力:

ObjectSpace.each_object.any? {|o| some_class.equal? (class << o; self; end)}
于 2012-10-10T14:03:57.910 回答
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
于 2014-02-01T21:12:41.030 回答