Kotlin: ¿Por qué no puedo hacer una tarea en un protector de bucle?

¿Por qué esta syntax no es válida? El error que informa IntelliJ es que solo se permiten expresiones en dicho context (línea 2). Me pregunto si hay alguna syntax para evitar esto, ya que Java permitió este tipo de asignación en la function de ciclo.

var c: Int; while ((c = reader.read()) != 1) { } 

La syntax no es válida, porque c = reader.read() no es una expresión en Kotlin, esto evita todos los == vs = errores.

Tienes que reescribirlo como:

 while (true) { val c = reader.read() if (c == 1) break ... } 

Nota: La otra respuesta explica el problema con su syntax, aquí hay una alternativa al uso del ciclo while.

Una gran ventaja de Kotlin es que puedes cambiar tu propio mundo para que sea exactamente como lo quieres. Así que creemos una function de extensión para hacer lo que básicamente está en las otras respuestas, pero haciéndola más atractiva.

Con esta function de extensión:

 inline fun Reader.readWhile(crossinline pnetworkingicate: (Int) -> Boolean): Sequence<Char> { return generateSequence { val c = this.read() if (c != -1 && pnetworkingicate(c)) { c.toChar() } else { null } } } 

Ahora puede simplemente:

 reader.readWhile { it != 1 }.forEach { // do something with each char } 

Y si quieres cerrar automáticamente el lector:

 reader.use { reader.readWhile { it != 1 }.forEach { // do something with each char } } 

Y, por supuesto, usted decide si la secuencia es de Char o Int según sus necesidades. Podrías crear tus propios useChars o forEachChar o lo que sea que haga que tu código sea como tú quieres. Consulte la Referencia de Kotlin API para kotlin.io para ver ejemplos de otras extensiones, especialmente en Reader para get ideas.

Prueba de unidad

Una testing unitaria para la function de extensión:

 @Test fun testSo32596261() { val reader = CharArrayReader(charArrayOf('A', 'B', 'C', 1.toChar(), 'D', 'E', 'F')) reader.use { assertEquals(listOf('A', 'B', 'C'), reader.readWhile { it != 1 }.toList()) } } 
  • Sintaxis de quilates en las interfaces de Kotlin
  • El valor de retorno de las funciones de Kotlin se guarda en firebase
  • Excepción lanzada al usar @Service en Kotlin
  • Android RecyclerView Manejo de datos usando Kotlin: índice de cambio de filas después de la modificación
  • Método de ejecución en el object kotlin
  • Error de compilation de la llamada insegura de Kotlin en un receptor nulo después de un control nulo
  • Usando Moshi con múltiples campos de input
  • comportamiento inesperado de anulación con la delegación de la class Kotlin
  • Cómo mostrar datos usando la vista de tree de TornadoFX
  • Comparar String Kotlin
  • Kotlin NDArray con un constructor lambda con tipo de retorno genérico