Скалак не находит зависимые классы - PullRequest
1 голос
/ 06 ноября 2011

Я пытаюсь скомпилировать программу с 2 простейшими классами:

class BaseClass

помещено в BaseClass.scala и

class Test extends BaseClass

помещено в Test.scala. Выполнение команды scalac Test.scala завершается неудачно, причина BaseClass не найдена. Я не хочу компилировать классы один за другим или использовать scalac * .scala.

Та же операция в java работает: javac Test.java. Где я не прав?

Ответы [ 2 ]

5 голосов
/ 06 ноября 2011

Давайте сначала посмотрим, что делает Java:

dcs@dcs-132-CK-NF79:~/tmp$ ls *.java
BaseClass.java  Test.java
dcs@dcs-132-CK-NF79:~/tmp$ ls *.class
ls: cannot access *.class: No such file or directory
dcs@dcs-132-CK-NF79:~/tmp$ javac -cp . Test.java 
dcs@dcs-132-CK-NF79:~/tmp$ ls *.class
BaseClass.class  Test.class

Итак, как вы можете видеть, Java фактически компилирует BaseClass автоматически , когда вы это делаете. Возникает вопрос: как это можно сделать? Может ли он знать, какой файл для компиляции?

Ну, когда вы пишете extends BaseClass на Java, вы на самом деле знаете несколько вещей. Вы знаете каталог, в котором находятся эти файлы, по имени пакета. Он также знает, что BaseClass находится либо в текущем файле, либо в файле с именем BaseClass.java. Если вы сомневаетесь в каком-либо из этих фактов, попробуйте переместить файл из каталога или переименовать его и посмотреть, может ли Java скомпилировать его.

Так почему же Scala не может сделать то же самое? Потому что это не предполагает ничего! Файлы Scala могут находиться в любом каталоге, независимо от пакета, который они объявляют. Фактически, один файл Scala может даже объявить более одного пакета, что сделает правило каталога невозможным. Кроме того, класс Scala может находиться в любом файле независимо от его имени.

Итак, хотя Java диктует вам, в каком каталоге должен находиться файл и как он называется, а затем извлекает выгоду, позволяя опускать имена файлов из командной строки javac, Scala позволяет вам организовать свой код в любым способом, который вам кажется лучшим, но требует, чтобы вы указали, где находится этот код.

Выберите.

1 голос
/ 06 ноября 2011

Сначала вам нужно скомпилировать BaseClass.scala:

$ scalac Test.scala 
Test.scala:1: error: not found: type BaseClass
class Test extends BaseClass
                   ^
one error found
$ scalac BaseClass.scala
$ scalac Test.scala
$

EDIT Итак, теперь возникает вопрос, почему вы должны компилировать файлы один за другим?Ну, потому что компилятор Scala просто не выполняет такого рода обработку зависимостей.Его авторы, вероятно, ожидают, что вы будете использовать инструмент сборки, такой как sbt или Maven , чтобы они не беспокоились.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...