Scalac no encuentra clases dependientes

Estoy tratando de compilar el programa con las 2 clases más simples:

class BaseClass

colocado en BaseClass.scala y

class Test extends BaseClass

colocado en Test.scala. La emisión del comando scalac Test.scala falla, porque no se encuentra BaseClass. No quiero compilar clases una por una o usando scalac * .scala.

La misma operación en Java funciona: javac Test.java. ¿Dónde me equivoco?

preguntado el 06 de noviembre de 11 a las 15:11

2 Respuestas

Veamos primero qué hace 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

Entonces, como puede ver, Java en realidad compila BaseClass automáticamente cuando haces eso. Lo que plantea la pregunta: ¿cómo puede hacer eso? ¿Puede saber qué archivo compilar?

Bueno, cuando escribes extends BaseClass en Java, realmente sabes algunas cosas. Conoce el directorio donde se encuentran estos archivos, por el nombre del paquete. Tambien sabe BaseClass está en el archivo actual o en un archivo llamado BaseClass.java. Si duda de cualquiera de estos hechos, intente mover el archivo del directorio o renombrarlo, y vea si Java puede compilarlo.

Entonces, ¿por qué Scala no puede hacer lo mismo? ¡Porque no asume ninguna cosa! Los archivos de Scala pueden estar en cualquier directorio, independientemente del paquete que declaren. De hecho, un solo archivo Scala puede incluso declarar más de un paquete, lo que haría imposible la regla del directorio. Además, una clase Scala puede estar en cualquier archivo, independientemente de su nombre.

Entonces, mientras Java le dicta en qué directorio debe estar el archivo y cómo se llama, y ​​luego obtiene el beneficio al permitirle omitir los nombres de archivo de la línea de comando de javac, Scala le permite organizar su código de la manera que le parezca mejor, pero requiere que le diga dónde está ese código.

Lleve a su selección.

respondido 06 nov., 11:23

en mi humilde opinión, todavía parece sensato que Scala proporcione una compilación predeterminada de dependencias al estilo Java; de esa manera, "elija" podría referirse a una elección entre Scala y Scala, en lugar de entre Scala y Java (ew). - Dan Burton

@DanBurton Alto costo, bajo rendimiento, mayor complejidad. - Daniel C. Sobral

No quería hacer ninguna conjetura en la pregunta, para recibir la aprobación independiente de mis pensamientos. ¡Gracias! - Konstantin Milyutin

Necesitas compilar BaseClass.scala primero:

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

EDITAR Entonces, la pregunta ahora es ¿por qué tienes que compilar los archivos uno por uno? Bueno, porque el compilador de Scala simplemente no realiza este tipo de manejo de dependencias. Sus autores probablemente esperan que uses una herramienta de compilación como sbt or Maven para que no tengan que molestarse.

respondido 06 nov., 11:20

@damluar: Debería volver a leer su propia pregunta. No fue por eso. - Kim Stebel

Deberías recomendar lts en lugar de Maven. Además, ¿ scalac *.scala ¿trabajo? - Rafael

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.