for循环头中定义的变量范围

时间:2016-07-16 22:03:49

标签: kotlin

我注意到以下Kotlin代码编译并成功执行:

for (i in 1..2) {
    val i = "a"
    print(i)
}

这会打印aa。但是,我没有找到允许这种变量阴影的决定背后的理由。我会说这不是一个好习惯,即使在Java中也是禁止的。

我认为Kotlin设计师在改进Java语法方面做了很多工作,并将其融入日常实际应用中,所以我必须在这里遗漏一些东西?

1 个答案:

答案 0 :(得分:10)

Kotlin不会以任何方式限制变量阴影。理由很简单:" 一致性。"

由于你可以在大多数其他地方隐藏变量,为什么你只从允许的选项中排除一些循环变量?他们为什么这么特别?这是一种随意的差异。

任何范围都可以遮蔽另一个范围中使用的变量。它是 NOT 良好做法,并且确实产生了编译器警告 - 但它是允许的。

如果您想与项目的贡献者进行对话,请尝试讨论论坛或冗余频道,两者都是从Kotlin Community page链接的。否则,如果您觉得它是一个错误,请向Kotlin YouTrack添加一个问题报告,您收到的答案也将是明确的。

与此同时,您可以自由编写无意义的代码,例如:

val i = 1
class Foo() {
    val i = "monkey"
    init { println(i) }
    @Test fun boo() {
        println(i)
        val i = i.length
        println(i)
        if (i == 6) {
            val i = Date(System.currentTimeMillis() + i) // Shadow warning
            println(i)
        }
        for (i in 0..i) {                                // Shadow warning
            val i = "chimp $i"                           // Shadow warning
            println(i)
        }
        InnerFoo()
    }
    class InnerFoo() {
        val i: Long = 100L
        init { println(i) }
    }
}

在Kotlin 1.0.3中产生3个警告。

  

警告:(15,21)Kotlin:名字被遮蔽:i   警告:(18,18)Kotlin:名字阴影:我
  警告:(19,21)Kotlin:名字阴影:我

输出:

  

猴子猴子6 6周日7月17日11:31:23 UYT 2016

黑猩猩0
黑猩猩1
黑猩猩2
黑猩猩3
黑猩猩4
黑猩猩5
黑猩猩6
100