私はほとんどの場合、Scala REPLセッションを1つか2つ開いているので、JavaまたはScalaクラスを簡単にテストできます。しかし、クラスを変更して再コンパイルすると、REPLは古いクラスがロードされたまま続行されます。 REPLを再起動するのではなく、クラスをリロードする方法はありますか?
具体的な例を示すために、ファイルTest.scalaがあるとします。
object Test { def hello = "Hello World" }
それをコンパイルしてREPLを開始します。
~/pkg/scala-2.8.0.Beta1-prerelease$ bin/scala
Welcome to Scala version 2.8.0.Beta1-prerelease
(Java HotSpot(TM) Server VM, Java 1.6.0_16).
Type in expressions to have them evaluated.
Type :help for more information.
scala> Test.hello
res0: Java.lang.String = Hello World
次に、ソースファイルをに変更します
object Test {
def hello = "Hello World"
def goodbye = "Goodbye, Cruel World"
}
しかし、それを使用することはできません:
scala> Test.goodbye
<console>:5: error: value goodbye is not a member of object Test
Test.goodbye
^
scala> import Test;
<console>:1: error: '.' expected but ';' found.
import Test;
クラスのリロードは簡単な問題ではありません。実際、これはJVMが非常に困難にしていることです。ただし、いくつかのオプションがあります。
残念ながら、これらは両方ともScala REPLの実装の詳細によって制限されます。私はJRebelを使用し、通常はそれでうまくいきますが、REPL =リロードされたクラスは反映されません。それでも、何もないよりはましです。
目標が前のコマンドを繰り返す必要がないことである場合、クラスをリロードする代わりの方法があります。 REPLにはコマンドがあります
:replay
REPL環境を再起動し、以前のすべての有効なコマンドを再生します。 (無効なものはスキップされるため、以前に間違っていた場合、突然機能しません。)REPLがリセットされると、クラスがリロードされるため、新しいコマンドは再コンパイルされたクラスの内容を使用できます(実際には、古いコマンドもそれらの再コンパイルされたクラスを使用します)。
これは一般的な解決策ではありませんが、個々のセッションを再計算可能な状態で拡張するための便利なショートカットです。
注:これは、ベアScala REPLに適用されます。 SBTまたは他の環境から実行する場合、SBTまたは他の環境がクラスをパッケージ化する方法に応じて、機能する場合と機能しない場合があります。実際に使用されているクラスパスにあるものを更新しないと、もちろん機能します。仕事!
要件を満たすコマンドがあります
:load path/to/file.scala
scalaソースファイルをリロードしてクラスに再コンパイルすると、コードを再生できます
これは私のために働きます....
新しいソースファイルの場合Test.scala
このように見えます...
package com.tests
object Test {
def hello = "Hello World"
def goodbye = "Goodbye, Cruel World"
}
最初に、新しい変更をScalaコンソール(REPL)にロードする必要があります。
:load src/main/scala/com/tests/examples/Test.scala
次に、パッケージを再インポートして、Scalaコンソールで新しいコードを参照できるようにします。
import com.tests.Test
セッションを再開せずに新しいコードを楽しんでください:)
scala> Test.goodbye
res0: String = Goodbye, Cruel World
.scalaファイルがREPL)を開始するディレクトリにある場合は、フルパスを省略して、:load myfile.scala
を入力してからインポートすることができます。