为什么Scala解释器将已定义的对象称为”模块”?

Why is a defined object called 'module' by the Scala interpreter?

1
2
scala> object Test
defined module Test

为什么scala解释器将已定义的对象Test称为"模块",而不是伴随对象?

模块和伴生对象之间是否有区别?或者只是两个不同的名称一样?


从技术上讲,只有一种这样的东西,在语言规范中,它通常被称为"模块",但是您还会发现以下语句:"对象定义定义了单个对象(或:模块)……"(Scala语言规范)

此外,您只能说一个伴随对象实际伴随的东西:

"通常,类的伴随模块是与该类具有相同名称的对象,并且在相同的作用域和编译单元中定义。相反,该类称为模块的伴随类。" (再次考虑:伴随对象=伴随模块)

处于伴随状态会为伴随类添加功能,即可见性(例如,该类可以看到伴随模块的私有字段)。相同的作用域和编译单元意味着,它们需要在相同的源文件和相同的包中定义。

LtU上有一个有趣的线程,其中讨论了Scala的对象与模块术语。如果您感兴趣的话,它还包含指向Odersky和Zenger的论文的链接。展示他们如何看待ML语言的模块系统(OCaml对Scala的主要影响),以及如何将其框架化为各种模块化组合方法(建议该模块是一个更通用的概念;特性作为mixin模块,... )