Sí, hay una Hello.class generado. El compilador envolver su código dentro de un objeto Main
, compilarlo a continuación, ejecutar Main.main
, hello.scala dado de
println(args.mkString)
println(argv.mkString)
Si se ejecuta con la opción -Xprint:parser
: scala -Xprint:parser hello.scala foo bar
verá cómo el código se reescribe:
package <empty> {
object Main extends scala.ScalaObject {
def <init>() = {
super.<init>();
()
};
def main(argv: Array[String]): scala.Unit = {
val args = argv;
{
final class $anon extends scala.AnyRef {
def <init>() = {
super.<init>();
()
};
println(args.mkString);
println(argv.mkString)
};
new $anon()
}
}
}
}
Este código luego se compila (creo en un sistema de archivos de memoria, pero no estoy seguro) y se ejecuta. Mirando ScriptRunner
, veo que se crea un directorio temporal bajo la carpeta temporal predeterminada. Por ejemplo, mirando mi sistema, veo un montón de carpetas %TEMP%/scalascript*
.
Tenga en cuenta que incluso en el intérprete, el código no se interpreta. Consulte Scala: Is there a default class if no class is defined? para obtener más información (en realidad se está reescribiendo, compilando y evaluando).
¿Cómo hace el compilador 'val args = argv'? ¿Qué ocurre si uno escribe 'println (arguments.mkString)'? ¿Habrá un 'val arguments = argv'? –
@PeterSchmitz, 'args' y' argv' están codificados, ver https://github.com/scala/scala/blob/master/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala # L358 y alrededor de la línea 388. Esos nombres son simplemente convenciones de C ('argv') y programación de Java (' args'). Si escribe 'println (arguments.mkString)', obtendrá un error de compilación porque 'arguments' no está definido. – huynhjl
Gracias, no lo sabía. ¡Aunque estoy un poco sorprendido! Por lo que he aprendido "hard-coded" no es bueno en general ... –