2011-10-04 7 views

risposta

22

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

+0

Come fa il compilatore a 'val args = argv'? Cosa succede se si digita 'println (arguments.mkString)'? Ci sarà un 'val argument = argv'? –

+0

@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

+0

Grazie, non lo sapeva. Anche se sono un po 'sorpreso! Per quanto ho appreso, "hardcoded" non è buono in generale ... –