我注意到以下Kotlin代码可以编译并成功执行:
for (i in 1..2) {
val i = "a"
print(i)
}
此打印aa
。但是,我没有找到允许这种可变阴影的决定背后的理由。我会说这不是一个好习惯,即使在Java中也是禁止的。
我认为Kotlin的设计师在改进Java语法并将其适应日常使用中所做的出色工作,因此我在这里一定会遗漏一些东西吗?
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) }
}
}
在Kotlin 1.0.3中哪个会产生3条警告。
警告:(15,21)Kotlin:阴影:i
警告:(18,18)Kotlin:名称被阴影:i
警告:(19,21)Kotlin:名称被阴影:i
并输出:
猴
猴
6
太阳年07月17 11时31分23秒UYT 2016
黑猩猩0
黑猩猩1
黑猩猩2
黑猩猩3
黑猩猩4
黑猩猩5
黑猩猩6
100
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句