scala> object Test
defined module Test
定義されたオブジェクトTest
が、scalaインタープリターによってコンパニオンオブジェクトではなく「モジュール」と呼ばれるのはなぜですか?
モジュールとコンパニオンオブジェクトに違いはありますか、それとも2つの異なる名前で同じですか?
技術的には、そのようなものは1つだけです。言語仕様では、ほとんどが「モジュール」と呼ばれますが、「オブジェクト定義は単一のオブジェクト(または:モジュール)を定義します...」(Scala言語仕様)というステートメントもあります。
さらに、コンパニオンオブジェクトについて話すことができるのは、それが実際に何かを伴う場合のみです。
「一般に、クラスのコンパニオンモジュールは、クラスと同じ名前を持ち、同じスコープとコンパイルユニットで定義されているオブジェクトです。逆に、クラスはモジュールのコンパニオンクラスと呼ばれます。」(もう一度考えてください:コンパニオンオブジェクト=コンパニオンモジュール)
コンパニオン状態になると、コンパニオンクラスに機能、つまり可視性が追加されます(たとえば、クラスはコンパニオンモジュールのプライベートフィールドを見ることができます)。同じスコープとコンパイル単位は、同じソースファイルと同じパッケージで定義する必要があることを意味します。
LtUには興味深いスレッドがあり、Scalaのオブジェクトとモジュールの用語が説明されています。興味があれば、オーダスキーとゼンガーの論文へのリンクも含まれています。彼らがML言語のモジュールシステム(OCamlはScalaに大きな影響を与える)を特にどのように見ているか、そしてモジュール構成のさまざまなアプローチとしてそれをどのように組み立てているかを示しています(そのモジュールがより一般的な概念であることを示唆しています;ミックスインモジュールとしての特性、... )。