Циклы
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() }
- Я не рекомендую это, так как есть и другие варианты использования 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)
}
}