ruby - 知道一个类是否是一个特征类

标签 ruby eigenclass

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

最佳答案

(在 Ruby 2.0 之前)以下表达式的计算结果为 true,前提是对象 x 是一个特征类:

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

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

从 Ruby 2.0 开始,上面的表达式不足以检测特征类,因为对于具有 prepended 模块的类,它的计算结果也为 true。这可以通过额外检查 x.ancestors.first 不是这样的前置模块来解决,例如通过 Class === x.ancestors.first。另一种解决方案是修改整个表达式如下:

Class === x && !x.ancestors.include?(x)

关于ruby - 知道一个类是否是一个特征类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12820984/

相关文章:

ruby-on-rails - 为此关系创建迁移

ruby-on-rails - 限制资源路由并在 Rails 3 中添加额外的非 RESTful 路由

ruby - 在 ruby​​ 类的特征类中设置实例默认值

ruby - 从特征类确定类

ruby - 通过include添加类方法

ruby-on-rails - Ruby:如何将一种方法接收到的所有参数和 block 传递给另一种方法?

ruby - 你如何在 Ruby/Tk 中制作箭头键事件处理程序

ruby-on-rails - 在 Rails ActiveRecord 查询中有条件地链接 where 子句

ruby - 可以枚举特征类吗?

Ruby - 与对象的特征类共享局部变量