Val在Scala中的行为

时间:2013-08-20 18:20:10

标签: 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

    }
}

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

enter image description here

2 个答案:

答案 0 :(得分:8)

你没有做相同的 - 你刚刚重新定义(shadowed *)val,没有重新赋值给它。如果你写y = if (x < 50) 0 else 1而不是val y = if (x < 50) 0 else 1,你也会得到错误。

enter image description here

*这只能在REPL中使用

答案 1 :(得分:7)

在REPL中,您键入的每个语句都将包含在嵌套在前一个语句的对象中的对象内。这是专门完成的,以便您可以稍后“更改”valclass es或trait s的值。否则,您必须重新启动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的{​​{1}}可以隐藏y的{​​{1}}。