scala> object Test
defined module Test
为什么Test
scala解释器将定义的对象称为“模块”,而不是伴随对象?
模块和伴生对象之间是否有区别,或者两个不同的名称是一样的?
从技术上讲,只有一个这样的东西,在语言规范中它主要被称为“模块”,但你也会发现这样的说法:“对象定义定义了一个单一的对象(或:模块)......”(Scala Language Specification)
此外,你只能说一个伴随对象,当它实际上伴随着一些东西时:
“一般来说,类的伴生模块是与类同名,定义在同一作用域和编译单元中的对象。反之,类称为模块的伴生类。” (再想想:伴生对象 = 伴生模块)
处于伴生状态为伴生类增加了特性,即可见性(例如,类可以看到伴生模块的私有字段)。相同的范围和编译单元意味着,它们需要定义在相同的源文件和相同的包中。
LtU上有一个有趣的线程,讨论了 Scala 的对象与模块术语。如果您感兴趣,它还包含指向 Odersky 和 Zenger 的论文的链接;展示了他们如何特别关注 ML 语言的模块系统(OCaml 对 Scala 产生了重大影响),以及他们如何将其构建为模块化组合的各种方法(表明该模块是一个更通用的概念;特征作为 mixin 模块,... )