Scala高级循环问题求助:为何循环中z始终保持为10?
嘿,这个问题我太熟悉了!结合你给出的输出和描述,大概率是变量作用域/不可变性或者循环内的变量重置导致的,我给你分两种最常见的场景拆解:
场景1:误将z声明为不可变的val
如果你的代码类似这样:
// 错误示例:z是不可变的val val z = 10 val result = for (i <- 2 to 4) yield { // 你以为这里修改了z,但val根本不能被重新赋值 val currentZ = z - 1 (i, currentZ) } // 输出就是 2 9 3 9 4 9 result.foreach { case (num, zVal) => print(s"$num $zVal ") }
原因解释:
val声明的变量是不可变的,一旦赋值就不能修改。你看到的z始终保持为10是完全正确的,因为z从始至终都是10。- 每次循环里计算的
z-1只是临时生成了一个新的数值9,并没有改变z本身,所以每次输出的都是9,和你预期的“z逐步递减”不符。
场景2:循环内每次都重置了z的值
如果你的代码是这样的:
// 错误示例:每次循环都把z重置为10 var z = 0 val result = for (i <- 2 to 4) yield { // 这里每次循环都重新把z设为10,覆盖了之前的修改 z = 10 z -= 1 (i, z) } // 输出同样是 2 9 3 9 4 9 result.foreach { case (num, zVal) => print(s"$num $zVal ") }
原因解释:
- 虽然
z是可变的var,但你在每次循环迭代里都把它重新赋值为10,然后再减1得到9。相当于每次循环都从头开始计算,自然不会出现你预期的递减效果。 - 你观察到“z始终保持为10”可能是调试时看到了
z = 10这行的赋值操作,忽略了后续的减1,或者调试断点停在了赋值后的瞬间。
正确的实现(如果你的预期是z逐步递减)
如果你想要输出2 9 3 8 4 7这种z逐步递减的效果,应该把z的初始化放在循环外面,并且不在循环内重置它:
var z = 10 val result = for (i <- 2 to 4) yield { z -= 1 (i, z) } // 输出:2 9 3 8 4 7 result.foreach { case (num, zVal) => print(s"$num $zVal ") }
总结一下:核心问题要么是混淆了Scala中val(不可变)和var(可变)的区别,要么是循环内的变量重置逻辑覆盖了你想要的累加/递减操作。
内容的提问来源于stack exchange,提问作者梁嘉腾
相关产品推荐
相关产品推荐

