【问题标题】:Knowing if a class is an eigenclass知道一个类是否是一个特征类
【发布时间】:2012-10-01 00:30:26
【问题描述】:

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

【问题讨论】:

    标签: ruby eigenclass


    【解决方案1】:

    至少在 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
    

    【讨论】:

      【解决方案2】:

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

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

      === 相等性检查断言xClass 类的一个实例,!= 不等式检查使用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)
      

      【讨论】:

        【解决方案3】:

        总是有蛮力:

        ObjectSpace.each_object.any? {|o| some_class.equal? (class << o; self; end)}
        

        【讨论】:

        • 我可以找到定义的方法eigenclass。它是在什么模块上定义的?
        • @sawa 抱歉,我已经在我的 irb 会话中定义了它。
        • some_class == some_class.ancestors.firstsome_class.ancestors.first == Class 也可以吗?
        • @sawa Class 也是如此。
        • 你是对的。那么,只要我认为Class 是唯一的例外,它就会起作用吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-26
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多