Adr*_*ian 18 scala read-eval-print-loop
当我从命令行运行类似下面的内容时,会发生什么?
> scala hello.scala
Run Code Online (Sandbox Code Playgroud)
是否有生成,执行,然后丢弃的hello.class?或者Scala在这种情况下表现得像某个解释器?我只是想,当然,我不能对Java做同样的事情:
> java hello.java
Run Code Online (Sandbox Code Playgroud)
huy*_*hjl 23
是的,生成了hello.class.编译器将你的代码包装在一个Main对象中,编译然后执行Main.main,给出hello.scala
println(args.mkString)
println(argv.mkString)
Run Code Online (Sandbox Code Playgroud)
如果使用-Xprint:parser选项运行:scala -Xprint:parser hello.scala foo bar您将看到代码如何被重写:
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()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后编译这段代码(我相信一个内存文件系统 - 但我不确定)并执行.看ScriptRunner,我看到在默认的临时文件夹下创建了一个临时目录.比如查看我的系统,我看到了一堆%TEMP%/scalascript*文件夹.
请注意,即使在解释器中,也不会解释代码.请参阅Scala:如果没有定义类,是否有默认类?了解更多信息(它真的被重写,编译和评估).