Kotlin中如何在循环内初始化val?代码运行原理咨询
Kotlin循环中每次迭代初始化val的原理及代码运行原因
代码能正常运行的核心原因
你这段代码能跑起来,关键在于作用域的隔离:
repeat(n)是Kotlin标准库提供的函数,它会把传入的Lambda代码块完整执行n次。- 每次执行Lambda时,都会进入一个全新的局部作用域。你在Lambda里定义的
val next,其作用域只限于当前这次迭代的代码块内部。 - Kotlin对
val的限制是“同一个作用域内不能重复声明或修改”,但不同作用域下完全可以定义同名的val——因为它们是彼此独立的新变量,不是对同一个变量的重复赋值。
另外代码里的sum应该是在外部定义的可变变量(比如var sum = 0),它的作用域覆盖了整个repeat代码块,所以每次迭代都能对它进行累加操作。
如何在循环每次迭代中初始化val
你这段代码已经是正确的实现方式了,核心思路就是把val的定义放在循环每次执行的代码块内部:
- 不管是用
repeat的Lambda,还是for循环的代码块,每次迭代都会创建一个新的作用域,在这个作用域内定义val,就相当于每次迭代都初始化了一个全新的只读变量。 - 举个
for循环的等价例子:
val n = readln().toInt() var sum = 0 for (_ in 1..n) { val next = readln().toInt() sum += next }
这里每次循环的{}都是独立作用域,val next每次都是全新的变量,完全符合Kotlin的语法规则。
总结一下:val的“只读”是针对同一作用域的,利用循环迭代时的作用域隔离,就能轻松实现每次迭代初始化新的val变量。
内容的提问来源于stack exchange,提问作者Ruben Caseiro
相关产品推荐
相关产品推荐

