【发布时间】:2012-10-01 00:30:26
【问题描述】:
判断一个类 some_class 是否是某个对象的特征类的最佳方法是什么?
【问题讨论】:
标签: ruby eigenclass
判断一个类 some_class 是否是某个对象的特征类的最佳方法是什么?
【问题讨论】:
标签: ruby eigenclass
至少在 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
【讨论】:
(在 Ruby 2.0 之前)仅当对象 x 是一个特征类时,以下表达式的计算结果为 true:
Class === x && x.ancestors.first != x
=== 相等性检查断言x 是Class 类的一个实例,!= 不等式检查使用ancestors 内省方法“跳过”特征类这一事实。
对于作为Object 类的实例的对象x(即x 不是空白石板对象),Class === x 检查等效于x.is_a? Class,或者在这种特殊情况下,等效于x.instance_of? Class。
从 Ruby 2.0 开始,上述表达式不足以检测特征类,因为对于具有 prepended 模块的类,它的计算结果也为 true。这可以通过额外检查x.ancestors.first 不是这样的前置模块来解决,例如通过Class === x.ancestors.first。另一种解决方案是将整个表达式修改如下:
Class === x && !x.ancestors.include?(x)
【讨论】:
总是有蛮力:
ObjectSpace.each_object.any? {|o| some_class.equal? (class << o; self; end)}
【讨论】:
eigenclass。它是在什么模块上定义的?
some_class == some_class.ancestors.first 或 some_class.ancestors.first == Class 也可以吗?
Class 也是如此。
Class 是唯一的例外,它就会起作用吗?