我刚刚做了这个实验:
class A < Hash
def foo
'foo'
end
end
class A < Hash
def bar
'bar'
end
end
到目前为止,我得到了预期的结果,第二个声明扩展了第一个声明。然而,我对此感到惊讶:
class A
def call
puts foo
puts bar
end
end
上面的代码有效,但前提是我稍后声明它。否则我会得到:
TypeError: superclass mismatch for class A
我可以假设在 Ruby 中,在确保“原始优先”声明被解析后跳过父类(super class)规范是安全的而没有副作用吗?
最佳答案
您只能在类定义的第一次出现时声明继承,因此以下变体将起作用:
当您定义了相同的类继承时:
class A < Hash end class A < Hash end
当您在第二种情况下使用默认继承时,将被视为未定义继承:
class A < Hash end class A end
当您在这两种情况下都使用默认继承时,默认继承是
Object
类:class A end class A end
下面不会:
当您在第一种情况下使用默认继承,然后您尝试显式重新定义它时:
class A end class A < Hash end TypeError: superclass mismatch for class A
当您在第一种情况下使用指定的继承(例如
String
),然后您尝试显式地重新定义它(例如Hash
) ):class A < String end class A < Hash end TypeError: superclass mismatch for class A
关于没有继承的 Ruby 类重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21483282/