10
scala> object Test
defined module Test

为什么Testscala解释器将定义的对象称为“模块”,而不是伴随对象?

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

4

1 回答 1

9

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

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

“一般来说,类的伴生模块是与类同名,定义在同一作用域和编译单元中的对象。反之,类称为模块的伴生类。” (再想想:伴生对象 = 伴生模块)

处于伴生状态为伴生类增加了特性,即可见性(例如,类可以看到伴生模块的私有字段)。相同的范围和编译单元意味着,它们需要定义在相同的源文件和相同的包中。


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

于 2012-06-29T17:40:41.647 回答