为什么循环体中的`val`可以采用多个值?

时间:2016-04-02 07:26:49

标签: scala

我了解到了

  

'val'是分配一次且永不改变的变量,只有val的状态改变。

据我所知

  

val无法多次定义。

但是当我执行以下代码(看起来像套接字消费者)

while (is.read(buf) > 0) {
  val input = new String(buf)
  println(input)
}

println(input)每次迭代显示不同的行。怎么会发生这种情况?

看起来input经常是新定义的,或者input不是新定义的,只是多次修改过。

鉴于val无法改变,这怎么可能?

2 个答案:

答案 0 :(得分:3)

分配给val的对象无法替换 input仅在while循环的范围内定义,因此在每次迭代中都会被销毁并再次声明。

while (is.read(buf)>0)
{
    val input = new String(buf)   // declared afresh in every iteration
    println(input)
}                               // input is destroyed when you reach here
println(input)                 // input is not defined in this scope

答案 1 :(得分:1)

那是因为你已经在循环中初始化了val。每次循环运行时,旧的val都会被取消范围,并使用新值创建一个新的val。