3

これは恥ずかしいですね。私の目的は、ScalaがJavaスタイルで書かれたパッケージステートメントをどのように扱うかを理解することです。この目的のために、私は小さなサンプルクラスを作成しました(以下のようにDinnerTimeP.scalaという名前を付けました:

package dinnertime
 class Dinner { 
  val veggie = "broccoli"
   def announceDinner(veggie: String) {
   println("Dinner happens to be tasteless " + veggie + " soup")
  }
 }

私はscaladevというフォルダーを持っており、その下にパッケージフォルダーdinnertimeを作成しました。このパッケージの下にはDinnerTimeP.scalaがあります。次に、DOSコマンドでdinnertimeに移動し、DinnerTimePファイル(名前はばかげているように聞こえます)を以下のようにscalacでコンパイルします。

C:\scala-2.9.1.final\scala-2.9.1.final\scaladev\dinnertime>set CLASSPATH=.;C:\scala-  2.9.1.final\scala-2.9.1.final\scaladev

C:\scala-2.9.1.final\scala-2.9.1.final\scaladev\dinnertime>scalac DinnerTimeP.scala

私は、dinnertimeフォルダーのすぐ下に生成されたDinner.classを見つけ、ソースファイルDinnerTimeP.scalaの隣に座っていることを望んでいました。理解を確認するために、同じフォルダーの下にHelloWorld.javaプログラムを作成しました。

package dinnertime;

public class HelloWorld {
  public static void main(String[] args) {
  System.out.println("Hello World");
}

}

コマンドラインでHelloWorld.javaを次のようにコンパイルしました:C:\ scala-2.9.1.final \ scala-2.9.1.final \ scaladev \dinnertime> javac HelloWorld.java

HelloWorld.classファイルは、そのソースファイルのすぐ隣に生成されました。これは、Scalaソースファイルとそのコンパイル済みファイルで見たかった正確な状況でした。代わりに、パッケージフォルダーdinnertime内にScalaによって生成された新しいパッケージフォルダーが表示されます。

これはナイーブかもしれません。私はおそらくScalaとパッケージの基本的な理解を裏切っていますが、この振る舞いに戸惑いました。これは私が自分自身に説明できない問題です。新しく生成されたクラスファイル用にネストされたパッケージが作成されるのはなぜですか。これは、私自身の真摯な努力に基づいて解決したいと思っていた問題です。現時点でのScalaの経験は限られているため、何が起こっているのかを理解するために、stackoverflowでScalaの達人に尋ねることに頼りました。なぜ?このネストされたパッケージがJavaではなくScalaによって作成される理由はありますか?

4

2 に答える 2

5

Tomaszが、それを機能させるために必要なことをすべて 説明してくれたので、その理由を説明しましょう。

Scala は、ソース ファイルがパッケージを反映するディレクトリ階層にあることを強制しません。つまり、どこDinner.scalaにでもある可能性があります。それは単に問題ではありません。

そして、明確にするために、複雑なパッケージ階層があり、深く、各レベルに複数のサブパッケージがある場合でも、すべてのソース ファイルを 1 つのディレクトリに配置できます。Scala ファイルが置かれているディレクトリは関係ありません

強調しすぎて申し訳ありませんが、Java から来ているので、これを理解するのは難しいかもしれません。

わかりました、今、どのように説明しdinnertime/Dinner.classますか?JVMはクラス ファイルをパッケージ名に対応するディレクトリ階層に配置することを要求するため、Scala ソース ファイルを任意のディレクトリに配置できる場合でも、 scalacはディレクトリ構造がパッケージ名を反映する出力を生成する必要があります。

したがって、すべてを確認すると、Scala はユーザーがどのディレクトリにいたかを気にしないため、ユーザーが というディレクトリにいるという事実を無視しましたdinnertime。ただし、ソース コードはクラスが という名前のパッケージにあることを示していたため、そのdinnertimeようなディレクトリを作成し、クラス ファイルをそこに配置しました。-dTomaszの回答によると、そのベースは現在のディレクトリであると想定されており、パラメーターで変更できます。

于 2012-07-19T19:28:07.137 に答える
5

まず、ルート ディレクトリからコンパイルしてみます。これdinnertimeがサブディレクトリです。

$ javac dinnertime/HelloWorld.java

と:

$ scalac dinnertime/Dinner.scala

どちらも同じ出力を生成します。つまり、どちらの場合も、.classファイルはサブディレクトリの下に置かれますdinnertime

パッケージ内でコンパイラを実行すると、違いが生じます。javac現在のディレクトリではなく、ルートディレクトリに関連するターゲットバイナリファイルを配置するのに十分賢いことが判明しました。これは、scalac常に現在のディレクトリをベースとして使用する場合には当てはまりません。-dこれは、パラメーターを使用して簡単に修正できます。

$ cd dinnertime
$ scalac -d .. Dinner.scala
于 2012-07-19T19:08:57.180 に答える