无继承的Ruby类重写

无继承的Ruby类重写,ruby,inheritance,Ruby,Inheritance,我刚刚做了这个实验: class A < Hash def foo 'foo' end end class A < Hash def bar 'bar' end end 上面的代码是有效的,但只有在我稍后声明它时才有效。否则我会得到: TypeError: superclass mismatch for class A 我可以假设在Ruby中,在确保解析了“原始的第一个”声明之后,跳过超类规范而没有副作用是安全的吗 您只能在类定义的第一次出现时

我刚刚做了这个实验:

class A < Hash
  def foo
    'foo'
  end
end

class A < Hash
  def bar 
    'bar'
  end
end
上面的代码是有效的,但只有在我稍后声明它时才有效。否则我会得到:

TypeError: superclass mismatch for class A

我可以假设在Ruby中,在确保解析了“原始的第一个”声明之后,跳过超类规范而没有副作用是安全的吗

您只能在类定义的第一次出现时声明继承,因此下面的变体将起作用:

  • 定义了同一类继承后:

    class A < Hash
    end
    
    class A < Hash
    end
    
  • 以下内容将不会:

  • 在第一种情况下使用默认继承,然后尝试显式重新定义它时:

    class A
    end
    
    class A < Hash
    end
    
    TypeError: superclass mismatch for class A
    
  • 以更好的方式解释了这个案例,所以我不会尝试这样做。但我会告诉你另一种方法

    避免错误的一种方法是在您的情况下:

    而不是写作

    class A
      def call
        puts foo
        puts bar
      end
    end
    
    使用以下方法编写:

    在mod的上下文中计算字符串或块,除非给定块时,常量/类变量查找不受影响。这可用于向类添加方法<代码>模块评估返回评估其参数的结果


    是的,这是正确的。在您上次的尝试中,它尝试将
    对象
    类作为其超类。。所以你的错误。。这是意料之中的。。
    class A
    end
    
    class A
    end
    
    class A
    end
    
    class A < Hash
    end
    
    TypeError: superclass mismatch for class A
    
    class A < String
    end
    
    class A < Hash
    end
    
    TypeError: superclass mismatch for class A
    
    class A
      def call
        puts foo
        puts bar
      end
    end
    
    A.class_eval do
      def _call
        puts foo
        puts bar
      end
    end