7

Java、Scala、または一般的に任意のJVM言語には、デフォルトでインポートされるパッケージのセットがあります。たとえば、Javaは自動的にインポートjava.langします。Javaコードファイルでインポートする必要はありません。

これを正確に処理するコンポーネント(コンパイラ?JVM?)はわかりませんが、デフォルトで追加のパッケージやクラスをインポートする方法はありますか?

プロジェクト全体で使用する一連のユーティリティ関数を定義するパッケージがあるとします(例はscala.mathScalaにある可能性があります)。すべての数学関連クラスで、そのインポートをスキップできれば素晴らしいと思います。

4

4 に答える 4

12

2.8以降のScalaにはパッケージオブジェクトがあり、その内容はパッケージのすべてのファイルに自動的にインポートされます。パッケージのトップレベルディレクトリ(例:)にpackage.scalaというファイルを作成し、そのファイルにx/y/z/mypackage入れます。

package x.y.z

package object mypackage {
  ...
}

次に、パッケージオブジェクト内の定義は、パッケージxyzmypackage内の任意のファイルに自動的にインポートされます(つまり、インポートステートメントは必要ありません)。

Scalaソースを見ることができます--finddir-name package.scalaを実行します-それらの束があり、最上位はすべてのscalaソースファイルに自動的にインポートされるscalaパッケージ自体の暗黙のインポートを定義します。

于 2011-02-17T11:08:33.560 に答える
11

Jim Balterは、彼の回答の中でScala 2.8パッケージオブジェクトについて言及しています(賛成票を投じてください) 。

クラス内に配置できるあらゆる種類の定義は、パッケージの最上位に配置することもできます。パッケージ全体のスコープに入れたいヘルパーメソッドがある場合は、先に進んでパッケージのトップレベルに配置します。

これを行うには、定義をパッケージオブジェクトに入れます。各パッケージは1つのパッケージオブジェクトを持つことができます

Scalaには実際には独自のscalaパッケージオブジェクトがあります。「パッケージオブジェクトを配置する場所
」を参照してください。

したがって、パッケージオブジェクトは、特定のパッケージの明示的なインポートの問題を解決できますが、どのパッケージの問題も解決できません。
現在の制限は次のとおりです。

  • まず、パッケージオブジェクトでオーバーロードされたメソッドを定義または継承することはできません。
  • 次に、同じパッケージ内の最上位クラスまたはオブジェクトの名前でもあるパッケージオブジェクト内のメンバーを定義または継承することはできません。

将来のScalaリリースでは、これらの制限が解除されると予想されます。


元の答え:

Scala側では、「Scalaはデフォルトでscala.collection.JavaConversions._をインポートする必要がありますか?」のような質問は、Scalaユーザーとしてデフォルトのインポートを追加することはできないことを示しています。
言語によってサポートされている必要があります。

ちなみに、結論は次のとおりです。

Scalaの専門家の観点から:物事を単純に保ち、デフォルトでインポートされる暗黙を絶対最小に制限しましょう。
ヘイコ・シーバーガー


しかし、ラファエルはコメントしています:

いくつかのパッケージを追加するために独自のコンパイラプラグインを作成できると思いますか?

そして確かに、このScalaの記事では、Scalaコンパイラーを拡張する方法について説明しています。
ただし、サポートされる主な追加機能は次のとおりです。

  • コンパイラーにフェーズを追加して、型チェックの終了後に適用される追加のチェックまたは追加のツリーの書き換えを追加できます。
  • 型に適用することを目的とした注釈に関するコンパイラの型チェック情報を伝えることができます。

したがって、ツリーの書き換え(追加のインポートを含む)を使用しても、型と関数(要求している暗黙のインポートによって参照される)を正しく分析できるように書き換えが行われるかどうかはわかりません。
しかし、おそらくScalaコンパイラコーナーにはそれに関するより多くのアイデアがあります。

于 2011-02-17T07:54:59.007 に答える
4

からのすべてのクラスのデフォルトのインポートは、 Java言語仕様(7.5.5)java.langで指定されています。

他のすべてのクラスは、importステートメントを使用してインポートする必要があります。

于 2011-02-17T08:14:38.497 に答える
1

Javaではそれを行う方法はありません。

于 2011-02-17T07:47:49.423 に答える