【问题标题】:Scala nondeterministic / caches classes?Scala不确定/缓存类?
【发布时间】:2014-03-20 15:32:24
【问题描述】:

我有一个非常简单的目标:编译一个 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

如果我不重新启动,我会收到一个错误,即我的构造函数中缺少一个字符串。不确定它在 Scala 的哪个地方缓存了以前的基于字符串的构造函数。

【问题讨论】:

  • 同意,可在 OSX 10.8.3、scala 2.10.3 上重现

标签: scala scalac


【解决方案1】:

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

请注意,这仅在使用 scala 运行脚本时发生,也就是说,.scala 文件包含具有主类的单个编译单元。

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

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

scala -nc test.scala

您也可以使用以下方法关闭该后台实例:

fsc -shutdown

或者重置它的缓存:

fsc -reset

【讨论】:

  • 在一百万年后都不会想到这一点。非常偷偷摸摸...谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 2022-11-04
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 2017-01-14
相关资源
最近更新 更多