我在尝试从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
}
}
现在,当我尝试从命令行执行相同操作时,为什么我没有收到相同的错误?
答案 0 :(得分:8)
你没有做相同的 - 你刚刚重新定义(shadowed *)val,没有重新赋值给它。如果你写y = if (x < 50) 0 else 1
而不是val y = if (x < 50) 0 else 1
,你也会得到错误。
*这只能在REPL中使用
答案 1 :(得分:7)
在REPL中,您键入的每个语句都将包含在嵌套在前一个语句的对象中的对象内。这是专门完成的,以便您可以稍后“更改”val
或class
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}}。