Tak, jest generowany plik hello.class. Kompilator zawinąć kod wewnątrz Main
obiektu, skompilować go następnie wykonać Main.main
, zważywszy hello.scala z
println(args.mkString)
println(argv.mkString)
Po uruchomieniu z opcją -Xprint:parser
: scala -Xprint:parser hello.scala foo bar
zobaczysz jak kod zostanie przepisany:
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()
}
}
}
}
Ten kod jest następnie kompilowany (wierzę w system plików pamięci - ale nie jestem pewien) i wykonany. Patrząc na ScriptRunner
widzę, że tymczasowy katalog jest tworzony w domyślnym folderze temp. Na przykład patrząc na mój system, widzę kilka folderów %TEMP%/scalascript*
.
Należy pamiętać, że nawet w tłumaczu kod nie jest interpretowany. Aby uzyskać więcej informacji, zobacz Scala: Is there a default class if no class is defined? (to naprawdę jest przepisywane, kompilowane i oceniane).
W jaki sposób kompilator tworzy "val args = argv'? Co się stanie, jeśli wpisze się 'println (arguments.mkString)'? Czy będzie argument "val arguments = argv"? –
@PeterSchmitz, 'args' i' argv' są zakodowane na stałe, patrz https://github.com/scala/scala/blob/master/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala # L358 i wokół linii 388. Te nazwy są po prostu konwencjami z C ("argv") i programowania Java ("args"). Jeśli wpiszesz 'println (arguments.mkString)' otrzymasz błąd kompilatora, ponieważ 'arguments' nie jest zdefiniowany. – huynhjl
Dzięki, nie wiedziałem tego. Chociaż jestem trochę zaskoczony! O ile się dowiaduję, "zakodowany" nie jest ogólnie dobry ... –