您可以[在解释器中重用变量名称],因为从概念上讲,解释器会为您键入的每个新语句创建一个新的嵌套范围。
除了允许重用变量名之外,这种范围的嵌套是否会对程序的理解方式产生任何其他差异?换句话说,如果我不重用变量名,那么相同的scala程序是否总是在交互式解释器中以相同的方式执行,并且如果作为脚本运行?
答案 0 :(得分:1)
不,脚本运行器将您的代码作为本地代码包装到合成的" main"方法。 REPL将每一行包装在一个单独的类实例或单例对象中,根据需要将其导入后续行。
在REPL中使用-Xprint:parser,typer
或// show
。
$ scala -nc -Xprint:parser,typer h.scala
[[syntax trees at end of parser]] // h.scala
package <empty> {
object Main extends scala.AnyRef {
def <init>() = {
super.<init>();
()
};
def main(args: Array[String]): scala.Unit = {
final class $anon extends scala.AnyRef {
def <init>() = {
super.<init>();
()
};
println("hello, world")
};
new $anon()
}
}
}
比较:
$ scala -Xprint:parser
Welcome to Scala 2.12.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_111).
Type in expressions for evaluation. Or try :help.
scala> println("hello, world.")
[[syntax trees at end of parser]] // <console>
package $line3 {
object $read extends scala.AnyRef {
def <init>() = {
super.<init>();
()
};
object $iw extends scala.AnyRef {
def <init>() = {
super.<init>();
()
};
object $iw extends scala.AnyRef {
def <init>() = {
super.<init>();
()
};
val res0 = println("hello, world.")
}
}
}
}