13

私には非常に単純な目標があります。Scala クラスをコンパイルし、それを別の Scala スクリプト内からロードすることです。問題は、Scala が私が作成したクラスを (どこにあるかわからない) キャッシュしているように見え、その後の変更を尊重しないことです。

次の行は、2 つの .scala ファイルを含むディレクトリを作成し、1 つをコンパイルして、もう 1 つを実行します。

mkdir test
cd test
echo 'class MyClass(s: String)' > MyClass.scala
echo 'val p = new MyClass("ok")' > test.scala
scalac MyClass.scala
scala test.scala # this works
cd ..
rm -rf test

上記の行を実行する場合、以下の行を機能させるには、コンピューターを再起動する必要があります。

mkdir test
cd test
echo 'class MyClass()' > MyClass.scala
echo 'val p = new MyClass()' > test.scala
scalac MyClass.scala
scala test.scala # this doesn't
cd ..
rm -rf test

再起動しないと、コンストラクターに文字列がないというエラーが表示されます。以前の String ベースのコンストラクターをキャッシュしている Scala ランドの場所がわかりません。

4

1 に答える 1

8

これは、scala スクリプト ランナーがコンパイル サーバーの常駐インスタンス ( fsc) をバックグラウンドで開始するためです。最初のスクリプトを実行した後java、メイン クラスで実行中のプロセスを見つけることができるはずです。scala.tools.nsc.CompileServer

scalaこれは、 がスクリプトの実行に使用された場合、つまり、メイン クラスを持つ単一のコンパイル ユニットを含まない.scalaファイルの場合にのみ発生することに注意してください。

への後続の呼び出しでscalaは、このコンパイル サーバーが使用されます (スクリプトの実行に使用される場合のみ)。これは、以前のコンパイルの実行に関する情報をキャッシュするため、エラーが発生します。

fsc次のコマンドを使用して、スクリプトを実行するときにscala を使用しないように指示できます。

scala -nc test.scala

次のコマンドを使用して、そのバックグラウンド インスタンスをシャットダウンすることもできます。

fsc -shutdown

または、キャッシュを次のようにリセットします。

fsc -reset
于 2014-03-20T16:52:25.397 に答える