for循环头文件中定义的variables范围

我注意到下面的Kotlin代码编译和执行成功:

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

这打印一个。 但是,我没有find允许这种可变阴影的决定的理由。 我会说这不是一个好的做法,甚至在Java中也是被禁止的。

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

Kotlin不以任何方式限制可变阴影。 理由很简单:“ 一致性”

既然你可以在大多数其他地方隐藏variables,为什么你只能从允许的选项中排除一些循环variables呢? 他们为什么这么特别? 这是一个任意的区别。

任何范围都可以隐藏另一个范围中使用的variables。 这是不好的做法,并产生一个编译器警告 – 但它是允许的。

如果您想与项目的贡献者进行对话,请尝试讨论论坛或闲聊频道,这两个链接均从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) } } } 

在Kotlin 1.0.3中哪个产生3个警告。

警告:(15,21)Kotlin:影子名称:i
警告:(18,18)Kotlin:影子名字:i
警告:(19,21)Kotlin:影子名字:i

并输出:



6
Sun Jul 17 17:31:23 UYT 2016
黑猩猩0
黑猩猩1
黑猩猩2
黑猩猩3
黑猩猩4
黑猩猩5
黑猩猩6
100