判断一个类some_class
是否是某个对象的特征类的最佳方法是什么?
问问题
232 次
3 回答
4
(在 Ruby 2.0 之前)以下表达式true
仅在对象是特征类时才计算为 if an x
:
Class === x && x.ancestors.first != x
===
等式检查断言它x
是Class
类的一个实例,不等式!=
检查使用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 回答