使用Kotlin时遇到一个问题。检查下面的代码示例。下面的代码执行时没有编译错误。 但是起初,我在下面的代码中代替了循环。那就是向元素抛出未解决的引用错误。
为什么我们在Kotlin会有这种奇怪而出乎意料的举动。请原谅Kotlin。
fun main(args: Array<String>) {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
val myarr=intArrayOf(1,2,3,4)
for(element in myarr){
println(element)
}
} 以下是我遇到错误的代码。我的问题是为什么它适用于for循环而不适用于一段时间
fun main(args: Array<String>) {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
val myarr=intArrayOf(1,2,3,4)
while(element in myarr){
println(element)
}
}
答案 0 :(得分:4)
while
循环需要一个布尔参数。在这种情况下,in
不是迭代器,它等效于in
布尔检查。示例:
fun demo(){
val x = 2;
val l = listOf(1, 2, 3);
while(x in l){
}
}
请注意,这是可怕的代码,它将导致无限循环。但这确实说明了这一点;在while循环中,in
用于布尔值,而不是范围。这也适用于数组。
它是一个未解决的引用的原因是因为您正在执行布尔检查,而不是for循环。对于循环,自动声明该字段,其中while
和if
都需要一个现有字段(即val x = something
)或直接声明(即while (2 in l)
)。后者删除变量名称。
因此,while
循环不会像for
这样使用可迭代对象。您有五个选项可迭代遍历:
for(i in 0 until list.size)
-list.size
可以是任何电话,只要是int for (item in list)
-这要求列表是可迭代的。 var i = 0;
while(i < list.size) {
// remember to increment `i`, otherwise it's an infinite loop
}
list.forEach { }
和list.forEachIndexed { i, item -> TODO() }
list.stream().forEach({ item -> TODO() })
如果您在while循环中按住CTRL +单击in
上的IntelliJ,您将被重定向到override fun contains(element: @UnsafeVariance E): Boolean
。如您所见,此方法返回一个布尔值。如果在for循环中执行相同的操作,则将重定向到override fun iterator(): Iterator<E>
。如您所见,它们有两种非常不同的返回类型。 while
循环使用布尔值1,而for
循环将使用迭代器1。 in
在这种情况下仅是语法上的。
为此,我强烈建议您使用for循环,尤其是因为您有数组。尽管while循环没有任何问题,但使用for
是个人喜好。
结束我的发言,得到未解析引用的原因是因为while循环实际上并未声明变量。如果添加变量,则代码将编译,但如果该项位于数组中,则将是无限循环:
fun main(args: Array<String>) {
val myarr=intArrayOf(1,2,3,4)
var element = 0; //if this is in the list, the the while loop is an infinite loop.
while(element in myarr){
println(element)
}
}
答案 1 :(得分:1)
在while循环中使用in
是不好的。但是,您可以执行以下操作:
fun main(args: Array<String>) {
var i = 0
val myarr=intArrayOf(1,2,3,4)
while (i < myarr.size)
println(myarr[i++])
}
参考: http://kotlinlang.org/docs/reference/control-flow.html#while-loops