Scala不确定/缓存类?

时间:2014-03-20 15:32:24

标签: scala scalac

我有一个非常简单的目标:编译Scala类,然后从另一个Scala脚本中加载它。问题是Scala似乎缓存(不确定在哪里)我创建的类,并且不遵守后续更改。

以下几行创建一个包含两个.scala文件的目录,编译一个,然后运行另一个:

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-land在哪里缓存了之前基于String的构造函数。

1 个答案:

答案 0 :(得分:7)

这是因为scala脚本运行器在后台启动编译服务器的常驻实例(fsc)。在运行第一个脚本后,您应该能够找到主要类java的正在运行的scala.tools.nsc.CompileServer进程。

请注意,只有在scala用于运行脚本时,才会发生这种情况,即包含带主类的单个编译单元的.scala文件

scala的后续调用将使用此编译服务器(仅在用于运行脚本时),该服务器缓存有关先前编译运行的信息,因此出错。

在运行脚本时,您可以指示scala不要使用fsc

scala -nc test.scala

您还可以使用以下命令关闭该背景实例:

fsc -shutdown

或者使用以下命令重置其缓存:

fsc -reset