2011-10-04 14 views

Respuesta

22

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

+0

¿Cómo hace el compilador 'val args = argv'? ¿Qué ocurre si uno escribe 'println (arguments.mkString)'? ¿Habrá un 'val arguments = argv'? –

+0

@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

+0

Gracias, no lo sabía. ¡Aunque estoy un poco sorprendido! Por lo que he aprendido "hard-coded" no es bueno en general ... –

Cuestiones relacionadas