判断类 some_class
是否为某个对象的特征类的最佳方法是什么?
最佳答案
(在 Ruby 2.0 之前)以下表达式的计算结果为 true
,前提是对象 x
是一个特征类:
Class === x && x.ancestors.first != x
===
相等性检查断言 x
是 Class
类的实例,!=
不等式检查使用 ancestors
内省(introspection)方法“跳过”特征类这一事实。
对于作为 Object
类实例的对象 x
(即 x
不是空白对象),Class === x
检查等同于 x.is_a? Class
或者,在这种特殊情况下,到 x.instance_of?类
。
从 Ruby 2.0 开始,上面的表达式不足以检测特征类,因为对于具有 prepend
ed 模块的类,它的计算结果也为 true
。这可以通过额外检查 x.ancestors.first
不是这样的前置模块来解决,例如通过 Class === x.ancestors.first
。另一种解决方案是修改整个表达式如下:
Class === x && !x.ancestors.include?(x)
关于ruby - 知道一个类是否是一个特征类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12820984/