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

Dra*_*vic 4 kotlin

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

for (i in 1..2) {
    val i = "a"
    print(i)
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jay*_*ard 10

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

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

任何范围都可以遮蔽另一个范围中使用的变量.这不是一个好习惯,并且会产生编译器警告 - 但它是允许的.

如果您想与项目的贡献者进行对话,请尝试讨论论坛或闲谈频道,两者都是从Kotlin社区页面链接的.否则,如果您觉得它是一个错误,请向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) }
    }
}
Run Code Online (Sandbox Code Playgroud)

在Kotlin 1.0.3中产生了3个警告.

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

并输出:

猴子
猴子
6
太阳7月17日11:31:23 UYT 2016
黑猩猩0
黑猩猩1
黑猩猩2
黑猩猩3
黑猩猩4
黑猩猩5
黑猩猩6
100