Kotlin: llaves de varias expresiones (o declaraciones)
Creo que esta pregunta está relacionada de alguna manera con la statement de la function de Kotlin: es igual al signo antes de las llaves
En Scala, cada enunciado es una expresión (posiblemente con tipo de Unit
). Si rodeamos expresiones múltiples con llaves, entonces la expresión final es el valor real de la parte con rizado. Por lo tanto,
- ¿Por qué no se puede escribir un parámetro en Kotlin que tenga otros límites si está limitado por otro parámetro de tipo?
- ¿Puede Kotlin emitir annotations JSR-305 en files de class
- ¿Cómo manejar correctamente los valores de Byte superiores a 127 en Kotlin?
- ¿Es posible devolver el mismo tipo que el parámetro de tipo en la instrucción when
- El parámetro de tipo reificado Kotlin no se puede usar como parámetro de tipo en el cuerpo de la function
// Scala val a = { val b = 1 val c = b + b c + c } println(a)
El tipo de a
es Int
y el código imprime el valor 4
.
Sin embargo, en Kotlin, esto es algo diferente. Si hacemos lo mismo en Kotlin,
// Kotlin val a = { val b = 1 val c = b + b c + c } println(a)
El tipo de a
es () -> Int
y el código imprime la Function0<java.lang.Integer>
, que significa un object de function 0-ary con el tipo de resultado Int
.
Entonces, si queremos imprimir el valor 4
, necesitamos hacer println(a())
.
De hecho, la expresión {}
en Kotlin es una function () -> ()
.
No puedo encontrar una explicación sobre esto en las páginas de reference oficiales de Kotlin. Sin una list de parameters o ->
, las llaves forman una function?
Cuando uso Scala, escribo muchos códigos como el primer código. Sin embargo, en Kotlin, crea un object de function y tenemos que llamar a la function, que puede ser una sobrecarga en un bucle o recursión.
-
¿Hay algún documento sobre esto: solo las llaves forman un object de function ?
-
¿Hay alguna manera de solucionar los gastos generales en el segundo código si se usa muchas veces?
EDITAR
Aquí está el código real que se repite muchas veces:
en Java
while ((count = input.read(data, 0, BYTE_BLOCK_SIZE)) != -1) { .... }
en Scala
while { count = input.read(data, 0, BYTE_BLOCK_SIZE) count != -1 } { .... }
en Kotlin
while ({ count = input.read(data, 0, BYTE_BLOCK_SIZE) count != -1 }()) { ... }
Como puedes ver, solo Kotlin fabrica una gran cantidad de objects funcionales y los llama.
- ¿Cómo crear una variable que pueda tomar cadenas y funciones en Kotlin?
- Objetos acompañantes ocultar class - ¿error o característica?
- ¿Cómo puedo declarar un parámetro de function que puede ser una cadena o una function en Kotlin?
- Cómo usar el tipo recursivo en Kotlin
- ¿Por qué var con private setter es una position invariante?
- function parámetro tipo coinciden problema
En Kotlin {}
son siempre una expresión lambda o una parte de una construcción de syntax como while(true) {}
. Probablemente diferente de Scala, pero fácil de comprender, no obstante.
Lo que probablemente quieras es:
val a = run { val b = 1 val c = b + b c + c } println(a)
Kotlin no tiene un concepto incorporado de "bloques de código en cualquier lugar". En su lugar usamos funciones estándar-ayudantes como run
en el ejemplo anterior.
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/run.html
Si {}
define una function, puede llamar a la function al declararla, lo que la evaluará inmediatamente:
val a = { val b = 1 val c = b + b c + c }() println(a)
impresiones 4
. (Tenga en count el ()
al final del bloque)
En Scala, cada statement es una expresión (posiblemente con el tipo de unidad)
Eso no es exactamente cierto. Comprobar: ¿todo es una function o expresión u object en Scala?
Como Zoltan dijo, {}
define funciones así que en lugar de:
// Kotlin val a = { val b = 1 val c = b + b c + c } println(a)
debería ser:
// Kotlin val a = { val b = 1 val c = b + b c + c } println(a()) //you defined a function, which returns `4`, not expression
o
// Kotlin val a = { val b = 1 val c = b + b c + c }() //note these braces println(a)
Si desea imprimir un valor, no function, puede intentar declarar la variable y luego usar una de las funciones de Kotlin para cambiar un valor como en el siguiente ejemplo:
var sum = 0 ints.filter { it > 0 }.forEach { sum += it } print(sum)
Leer: Funciones de order superior y Lambdas
Espero que ayude