2011-10-04 10 views

Odpowiedz

22

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).

+0

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"? –

+0

@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

+0

Dzięki, nie wiedziałem tego. Chociaż jestem trochę zaskoczony! O ile się dowiaduję, "zakodowany" nie jest ogólnie dobry ... –

Powiązane problemy