【发布时间】:2021-10-10 23:51:16
【问题描述】:
我是 Kotlin 的初学者,正在经历 for 循环
简单代码示例:
for (i in 1..5) print(i)
请有人告诉我为什么我们不使用关键字 var / val 指定计数器/迭代器变量类型“i”。因为“var /val”是在 Kotlin 中声明变量的标准方式。
【问题讨论】:
标签: kotlin
我是 Kotlin 的初学者,正在经历 for 循环
简单代码示例:
for (i in 1..5) print(i)
请有人告诉我为什么我们不使用关键字 var / val 指定计数器/迭代器变量类型“i”。因为“var /val”是在 Kotlin 中声明变量的标准方式。
【问题讨论】:
标签: kotlin
这就是for 循环语法的简单设计方式。我不能代表设计师说话,但我相信这是一个避免不必要的臃肿和混乱的设计决定。
您不能将现有变量用作循环变量。循环变量的范围为循环,并从外部范围隐藏现有变量。所以这有点暗示你在这里声明了一个新变量,即使没有关键字(但是我不得不承认,如果我们必须在这里写 val/var 关键字,阴影行为会更清楚)。
另外,循环变量实际上是循环体内部的val(它不能被重新分配),但感觉就像var,因为它会随着循环的每一轮而改变,并且在技术上是在循环体之外声明的。实际上,它就像在循环体中声明了一个新的val,每次循环迭代都有一个新值。
所以你的示例代码可以被认为是:
var temp = 1
while (temp <= 5) {
val i = temp
println(i)
temp++
}
这可能是设计师决定不在这里放置任何关键字的原因:这是不必要的,val 和 var 都会以自己的方式混淆。
【讨论】:
val,而不是var,可以看到here
val 或 var。它不完全是 var,因为它的行为类似于循环的每次迭代都重新声明的 val,因此它的范围是外壳内部的本地,即使它在外壳外部命名。
val。请记住,for 是基于迭代器的,因此它实际上被扩展为:val iter = list.iterator(); while (iter.hasNext()) { val item = iter.next() } - item 变量实际上并不存在于循环体之外。迭代范围是一个例外,因为它使用计数器,但这只是编译器优化。从概念上讲,for 正在迭代某些东西。
var 存在于整个循环中和 val 范围内的单一交互。