2011-10-04 38 views

回答

22

是的,有一個hello.class生成。 scala -Xprint:parser hello.scala foo bar你會看到代碼如何被改寫:如果使用-Xprint:parser選項運行編譯器將包裝你的代碼Main對象的內部,編譯那麼執行Main.main

println(args.mkString) 
println(argv.mkString) 

給出hello.scala

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() 
     } 
    } 
    } 
} 

然後編譯這段代碼(我相信是一個內存文件系統 - 但我不確定)並執行。查看ScriptRunner,我看到在默認的臨時文件夾下創建了一個臨時目錄。例如看我的系統,我看到一堆%TEMP%/scalascript*文件夾。

請注意,即使在解釋器中,代碼也不會被解釋。有關更多信息,請參見Scala: Is there a default class if no class is defined?(它正在被重寫,編譯和評估)。

+0

編譯器如何使'val args = argv'?如果有人輸入'println(arguments.mkString)'?會有'val arguments = argv'嗎? –

+0

@PeterSchmitz,'args'和'argv'是硬編碼的,請參閱https://github.com/scala/scala/blob/master/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala #L358和388行。這些名稱只是C('argv')和Java編程('args')的約定。如果你輸入'println(arguments.mkString)',你會得到一個編譯器錯誤,因爲'arguments'沒有被定義。 – huynhjl

+0

謝謝,不知道。雖然我有點驚訝!據我所知,「硬編碼」通常不是很好... –