scala解释器中的嵌套范围

时间:2016-12-31 17:29:56

标签: scala

Programming in Scala说:

  

您可以[在解释器中重用变量名称],因为从概念上讲,解释器会为您键入的每个新语句创建一个新的嵌套范围。

除了允许重用变量名之外,这种范围的嵌套是否会对程序的理解方式产生任何其他差异?换句话说,如果我不重用变量名,那么相同的scala程序是否总是在交互式解释器中以相同的方式执行,并且如果作为脚本运行?

1 个答案:

答案 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.")
      }
    }
  }
}