为什么在while循环中抛出未解决的参考错误,而for循环在kotlin中运行良好

时间:2018-09-25 16:56:53

标签: kotlin

使用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)
  }

}

2 个答案:

答案 0 :(得分:4)

while循环需要一个布尔参数。在这种情况下,in不是迭代器,它等效于in布尔检查。示例:

fun demo(){
    val x = 2;
    val l = listOf(1, 2, 3);
    while(x in l){

    }
}

请注意,这是可怕的代码,它将导致无限循环。但这确实说明了这一点;在while循环中,in用于布尔值,而不是范围。这也适用于数组。

它是一个未解决的引用的原因是因为您正在执行布尔检查,而不是for循环。对于循环,自动声明该字段,其中whileif都需要一个现有字段(即val x = something)或直接声明(即while (2 in l))。后者删除变量名称。

因此,while循环不会像for这样使用可迭代对象。您有五个选项可迭代遍历:

  1. for(i in 0 until list.size)-list.size可以是任何电话,只要是int
  2. for (item in list)-这要求列表是可迭代的。
  3. var i = 0;
    while(i < list.size) {
        // remember to increment `i`, otherwise it's an infinite loop
    }
    
  4. list.forEach { }list.forEachIndexed { i, item -> TODO() }
  5. 我不建议这样做,因为使用Kotlin stdlib会有更好的选择,但是它仍然是一个选择: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