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()) } } 
  • El complemento "kotlin-noarg" no funciona en el Reino
  • Kotlin: ¿"eso" asignable?
  • KotlinNullPointerException: inside onCreateOptionsMenu no puede encontrar searchView; android
  • Jacoco informa 0 cobertura de classs de Kotlin por testings unitarias, en un proyecto de Android
  • No se puede usar fontawesomefx con kotlin y tornadofx
  • Obtenga una date de un DatePickerDialog en Kotlin Android
  • ¿Cómo agrego TextViews dinámicamente a mi layout en function del contenido de un file JSON?
  • ¿Cómo accedo a un método estático de Java en una subclass de Kotlin?
  • Alcance de la variable definida en el encabezado de bucle for
  • testing JOOQ postgres jsonb column for key exists
  • GL_INVALID_OPERATION en glBufferData () en kotlin