【发布时间】:2011-12-01 02:15:49
【问题描述】:
当我从命令行运行类似以下内容时,到底会发生什么?
> scala hello.scala
是否有生成、执行、然后丢弃的 hello.class?或者在这种情况下,Scala 是否表现得像解释器?我只是在想,当然,我不能对 Java 做同样的事情:
> java hello.java
【问题讨论】:
标签: scala read-eval-print-loop
当我从命令行运行类似以下内容时,到底会发生什么?
> scala hello.scala
是否有生成、执行、然后丢弃的 hello.class?或者在这种情况下,Scala 是否表现得像解释器?我只是在想,当然,我不能对 Java 做同样的事情:
> java hello.java
【问题讨论】:
标签: scala read-eval-print-loop
是的,生成了一个 hello.class。编译器会将您的代码包装在 Main 对象中,编译它然后执行 Main.main,给定 hello.scala
println(args.mkString)
println(argv.mkString)
如果您使用-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()
}
}
}
}
然后编译此代码(我相信内存文件系统 - 但我不确定)并执行。查看ScriptRunner,我看到在默认临时文件夹下创建了一个临时目录。例如查看我的系统,我看到一堆 %TEMP%/scalascript* 文件夹。
请注意,即使在解释器中,代码也不会被解释。请参阅Scala: Is there a default class if no class is defined? 了解更多信息(它确实正在被重写、编译和评估)。
【讨论】:
val args = argv?如果一个类型println(arguments.mkString) 怎么办?会有val arguments = argv吗?
args 和 argv 是硬编码的,请参阅 github.com/scala/scala/blob/master/src/compiler/scala/tools/nsc/… 和第 388 行附近。这些名称只是 C (argv) 和 Java 编程 (@987654338) 的约定@)。如果您键入 println(arguments.mkString),您将收到编译器错误,因为未定义 arguments。
main,打印东西的方法叫println。我看不出有什么问题,也看不出你为什么会想要它……毕竟它必须被称为某种东西
println 尤其是 main 也是“硬编码”的,但我很困惑,像 args 这样的方法参数名称当时是“硬编码”的(但是我对此很好,args 必须有一个名称,因为不能明确说明),当我自己填充类中的 main 方法而不是由 REPL 构造时,我可以选择它(或者可能扩展 @ 987654347@)。一切都很好:D