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

Joh*_*ood 9 scala module

scala> object Test
defined module Test
Run Code Online (Sandbox Code Playgroud)

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

模块和伴侣对象之间是否存在差异,或者两个不同的名称是否相同?

0__*_*0__ 9

从技术上讲,只有一个这样的东西,在语言规范中它主要被称为"模块",但你也发现这句话:"对象定义定义了一个对象(或:模块)......"(Scala语言规范)

此外,你只能谈论一个伴侣对象,当它实际上伴随着一些东西时:

"通常,类的伴随模块是一个与类同名的对象,并且在同一范围和编译单元中定义.相反,该类称为模块的伴随类." (再想一想:伴侣对象=伴侣模块)

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


在LtU上有一个有趣的线程,其中讨论了Scala的对象与模块术语.它还包含了Odersky和Zenger的论文链接,如果你感兴趣的话; 展示了他们如何特别关注ML语言的模块系统(OCaml是对Scala的主要影响),以及它们如何将其作为模块化组合的各种方法构建(表明模块是一个更通用的概念;作为mixin模块的特征,... )