Val在Scala中的行为

Sud*_*Deb 3 scala

我在尝试从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

    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试从命令行执行相同的操作时,为什么我没有得到相同的错误?

在此输入图像描述

om-*_*nom 8

你没有做同样的事情- 你只是重新定义(阴影*)val,而不是重新赋值给它.如果你写y = if (x < 50) 0 else 1而不是val y = if (x < 50) 0 else 1你也会得到错误.

在此输入图像描述

*这只能在REPL中使用

  • 在REPL中,您键入的每个语句都将包含在嵌套在前一个语句的对象内的对象内.这是专门完成的,这样你就可以"改变"`val`s或`class`es或`trait`s'的值.否则,您必须重新启动REPL并在每次输入拼写错误时重新键入每个语句. (2认同)

Jör*_*tag 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
Run Code Online (Sandbox Code Playgroud)

由于Scala有嵌套作用域,Line3y可以阴影Line2y.