Scala 不确定性/缓存类?

标签 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

如果我不重新启动,则会收到一条错误消息,指出我的构造函数中缺少字符串。不确定 Scala 中的哪个位置缓存了之前基于字符串的构造函数。

最佳答案

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

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

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

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

scala -nc test.scala

您还可以通过以下方式关闭该后台实例:

fsc -shutdown

或者重置其缓存:

fsc -reset

关于Scala 不确定性/缓存类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22537763/

相关文章:

scala - Lift 中出现无法解释的错误消息

scala - 在 Scala 中将列表 List[String, String] 转换为 List[String, List[String]]?

Scala:用于理解类型推断问题的多个 flatMap 定义

scala - 干扰 Scala 动态特征的方法解析的字段?

scala - 在特定阶段后停止 Scala 编译

JSON 到 Scala 代码生成

scala - "Stream Processing with Apache Flink"如何从 IntelliJ 运行书籍代码?

scala - 依赖 future

java - 使用java API启动apache的drill进程?

scala - 在 Scala 编译错误中省略包名称