Scala недетерминированные/кеширует классы?

У меня очень простая цель: скомпилировать класс 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-land он кэширует предыдущий конструктор на основе String.


person Michael D. Moffitt    schedule 20.03.2014    source источник
comment
Согласен, воспроизводится на OSX 10.8.3, scala 2.10.3   -  person om-nom-nom    schedule 20.03.2014


Ответы (1)


Это связано с тем, что средство запуска сценария scala запускает резидентный экземпляр сервера компиляции (fsc) в фоновом режиме. Вы сможете найти запущенный процесс java с основным классом scala.tools.nsc.CompileServer после запуска вашего первого скрипта.

Обратите внимание, что это происходит только тогда, когда scala используется для запуска скрипта, то есть файл .scala, который не содержит ни одной единицы компиляции с основным классом.

Последующие вызовы scala будут использовать этот сервер компиляции (только при использовании для запуска сценария), который кэширует информацию о предыдущих запусках компиляции, отсюда и ошибка.

Вы можете указать scala не использовать fsc при запуске скрипта с помощью:

scala -nc test.scala

Вы также можете закрыть этот фоновый экземпляр с помощью:

fsc -shutdown

Или сбросьте его кеш с помощью:

fsc -reset
person gourlaysama    schedule 20.03.2014
comment
За миллион лет бы не догадался. Очень подлый ... спасибо! - person Michael D. Moffitt; 20.03.2014