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()) } } 
  • Cómo convertir un file fuente kotlin a un file fuente java
  • Anulación accidental: las siguientes declaraciones tienen la misma firma de JVM
  • Tipo genérico de Kotlin, Falló la inferencia de tipo
  • Orden de cálculo de operadores bit a bit en Kotlin
  • La vista es nula en onCreateView android
  • Cómo replace :: nuevo en kotlin?
  • Dagger 2 methods estáticos de proveedor en kotlin
  • KDoc: insert fragment de código
  • ¿Cómo se puede cambiar el contenedor de Gradle y el file de compilation por defecto en IntelliJ?
  • cómo acceder a las properties internas desde el código de testing java
  • Uso de Boolean? en si expresión