Почему нерешенная ошибка ссылки генерируется с циклом while, тогда как цикл for работает нормально в kotlin - PullRequest
0 голосов
/ 25 сентября 2018

Только что столкнулся с проблемой при работе с kotlin.проверьте ниже пример кода.Приведенный ниже код выполняется без ошибки компиляции. Но изначально у меня был цикл for в приведенном ниже коде.и это приводило к неразрешенной ошибке ссылки на элемент.

Почему у нас такое странное и неожиданное поведение в 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)
  }

} Ниже приведен код длякоторый у меня ошибкаУ меня вопрос, почему это работает для цикла, а не для пока

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 голосов
/ 25 сентября 2018
Циклы

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.У вас есть пять вариантов итерации итерируемого:

  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. Я не рекомендую это, так как есть и другие варианты использования stdlib Kotlin, но это все же вариант:list.stream().forEach({ item -> TODO() })

Если вы нажмете CTRL + щелкните IntelliJ на in в цикле while, вы будете перенаправлены на override fun contains(element: @UnsafeVariance E): Boolean.Как видите, этот метод возвращает логическое значение.Если вы сделаете то же самое в цикле for, вы будете перенаправлены на override fun iterator(): Iterator<E>.Как видите, у них есть два очень разных типа возврата.Цикл while использует логическое значение, а цикл for будет использовать итератор один.in является просто синтаксическим в этом случае.

И в завершение я настоятельно рекомендую использовать циклы, особенно если у вас есть массив.В цикле 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)
  }

}
0 голосов
/ 25 сентября 2018

Не рекомендуется использовать in в цикле while.Однако вы можете сделать что-то вроде ниже:

fun main(args: Array<String>) {
    var i = 0
    val myarr=intArrayOf(1,2,3,4)
    while (i < myarr.size)
        println(myarr[i++])
}

Ref: http://kotlinlang.org/docs/reference/control-flow.html#while-loops

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...