3

尝试从 Eclipse 执行以下代码时出现错误,因为我无法重新分配 Val,对吗?

object Test {
    def main(args: Array[String]){
      val tempVal = 100;

      val checkval = if (tempVal > 50) 1 else 0

      println("The new value is: " + checkval);

      //Getting Error Below
      checkval1 = if (tempVal > 200) 0

    }
}

现在当我试图从命令行做同样的事情时,为什么我没有得到同样的错误?

在此处输入图像描述

4

2 回答 2

8

你没有做同样的事情——你只是重新定义了 (shadowed*) val,而不是重新分配新值给它。如果你写y = if (x < 50) 0 else 1而不是val y = if (x < 50) 0 else 1你也会得到错误。

在此处输入图像描述

* 这仅在 REPL 中才有可能

于 2013-08-20T18:25:12.803 回答
7

在 REPL 中,您键入的每个语句都将包装在一个对象内,该对象嵌套在前一个语句的对象内。这是专门完成的,以便您以后可以“更改” vals 或classes 或traits 的值。否则,每次打错字时,您都必须重新启动 REPL 并重新键入每个语句。

因此,您的 REPL 会话(大致)编译为如下内容:

object Line1 {
  val x = 100
  println(x)

  object Line2 {
    val y = if (x < 50) 1 else 0
    println(y)

    object Line3 {
      val y = if (x < 50) 0 else 1
      println(y)
    }
    val _ = Line3 // force creating the Line3 object
  }
  val _ = Line2 // force creating the Line2 object
}
val _ = Line1 // force creating the Line1 object

由于 Scala 具有嵌套作用域,因此Line3'sy可以遮蔽Line2's y

于 2013-08-20T22:54:17.867 回答