【发布时间】:2020-08-31 11:37:35
【问题描述】:
我在 Ruby 中的一些基本概念上遇到了麻烦,特别是子类与超类的可互换性。
根据关于类的 Ruby 文档,“类”继承自“模块”。 https://ruby-doc.org/core-2.5.3/Class.html
class MyClassTest end
MyClassTest.is_a? Module # => true
但是,当尝试使用 module 关键字重新打开使用关键字 class 定义的类时,您会收到一个类型错误,表明该类不是模块。
class MyClassTest end
module MyClassTest end # => TypeError: MyClassTest is not a module
这个 SO question 围绕子类与子类型进行了一些精彩的讨论,但我认为它让我提出了更多问题: Why can't classes be used as modules?
一般来说,由于 Ruby 是动态类型的,我对 TypeErrors 的存在感到困惑。
具体来说,在这种情况下,我对 Ruby 继承如何导致子类无法替换超类的 TypeError 感到更加困惑。在我看来,子类化相当于 Ruby 中的子类型化,因为子类将继承超类的接口(方法和公共属性)。
我目前的猜测是,当某些断言失败时,核心 Ruby 库会引发 TypeError,而这些 TypeError 不一定与 Ruby 的动态类型系统有关,也就是说类型不是一流的Ruby 中的概念。链接的 SO 问题对多类继承的菱形问题提出了很好的观点,因此在使用 module 或 class 关键字时,Ruby 会阻止模块和类的可互换使用是有道理的。不过,感觉我对 Ruby 的理解还是有不一致的地方。
当需要“模块”对象时,“类”输入如何导致 TypeError?
【问题讨论】:
标签: ruby class module typeerror dynamic-typing