【问题标题】:Kotlin understanding missing var keyword in for loopKotlin 理解 for 循环中缺少的 var 关键字
【发布时间】:2021-10-10 23:51:16
【问题描述】:

我是 Kotlin 的初学者,正在经历 for 循环

简单代码示例:

 for (i in 1..5) print(i)

请有人告诉我为什么我们不使用关键字 var / val 指定计数器/迭代器变量类型“i”。因为“var /val”是在 Kotlin 中声明变量的标准方式。

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    这就是for 循环语法的简单设计方式。我不能代表设计师说话,但我相信这是一个避免不必要的臃肿和混乱的设计决定。

    您不能将现有变量用作循环变量。循环变量的范围为循环,并从外部范围隐藏现有变量。所以这有点暗示你在这里声明了一个新变量,即使没有关键字(但是我不得不承认,如果我们必须在这里写 val/var 关键字,阴影行为会更清楚)。

    另外,循环变量实际上是循环体内部的val(它不能被重新分配),但感觉就像var,因为它会随着循环的每一轮而改变,并且在技术上是在循环体之外声明的。实际上,它就像在循环体中声明了一个新的val,每次循环迭代都有一个新值。

    所以你的示例代码可以被认为是:

    var temp = 1
    while (temp <= 5) {
        val i = temp
        println(i)
        temp++
    }
    

    这可能是设计师决定不在这里放置任何关键字的原因:这是不必要的,valvar 都会以自己的方式混淆。

    【讨论】:

    • 其实循环变量是always val,而不是var,可以看到here
    • 也许这就是为什么他们倾向于不让你输入 valvar。它不完全是 var,因为它的行为类似于循环的每次迭代都重新声明的 val,因此它的范围是外壳内部的本地,即使它在外壳外部命名。
    • @MichaelPfaff 对,我写的有点误导,我会澄清这一点。我同意 Tenfour04,它既不是一个也不是另一个。我会更新我的答案以反映这一点。
    • 我一直认为这些变量只是普通的val。请记住,for 是基于迭代器的,因此它实际上被扩展为:val iter = list.iterator(); while (iter.hasNext()) { val item = iter.next() } - item 变量实际上并不存在于循环体之外。迭代范围是一个例外,因为它使用计数器,但这只是编译器优化。从概念上讲,for 正在迭代某些东西。
    • @broot 是的,我并不是要说明循环的实际脱糖,而是要指出,从概念上讲,好像有一些 var 存在于整个循环中和 val 范围内的单一交互。
    猜你喜欢
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    相关资源
    最近更新 更多