Sì, c'è un hello.class generato. Il compilatore avvolgere il vostro codice all'interno di un oggetto Main
, compilarlo quindi eseguire Main.main
, data hello.scala di
println(args.mkString)
println(argv.mkString)
Se si esegue con l'opzione -Xprint:parser
: scala -Xprint:parser hello.scala foo bar
vedrete come il codice viene riscritto:
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()
}
}
}
}
Questo codice viene quindi compilato (credo in un filesystem di memoria - ma non sono sicuro) ed eseguito. Guardando a ScriptRunner
, vedo che una cartella temporanea viene creata nella cartella temporanea predefinita. Ad esempio, guardando il mio sistema, vedo un mucchio di cartelle %TEMP%/scalascript*
.
Si noti che anche nell'interprete, il codice non viene interpretato. Vedi Scala: Is there a default class if no class is defined? per maggiori informazioni (è davvero in fase di riscrittura, compilazione e valutazione).
Come fa il compilatore a 'val args = argv'? Cosa succede se si digita 'println (arguments.mkString)'? Ci sarà un 'val argument = argv'? –
@PeterSchmitz, 'args' e' argv' sono codificati, vedere https://github.com/scala/scala/blob/master/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala # L358 e intorno alla riga 388. Questi nomi sono semplicemente convenzioni da C ('argv') e programmazione Java (' args'). Se si digita 'println (arguments.mkString)' si otterrà un errore del compilatore perché 'arguments' non è definito. – huynhjl
Grazie, non lo sapeva. Anche se sono un po 'sorpreso! Per quanto ho appreso, "hardcoded" non è buono in generale ... –