En el siguiente código tengo 2 funciones: la primera envuelta en un cuerpo lambda y la otra sin él.
fun first() = { println("first")} fun second() = println("second") first() second() Solo las second() imprimen: ¿por qué es esto?
La primera es una función que devuelve una función. Lo que sucede de hecho es que first() devuelve otra función que imprime "primero", pero no la ejecuta.
Para hacer esto, debe llamarlo agregando otro conjunto de paréntesis:
first()() // Or val resultOfFirst = first() resultOfFirst() Esto sucede porque el signo = para las funciones es análogo a una declaración de devolución y cuando envuelve las cosas en {} , de hecho, está creando una lambda. Por lo tanto, primero devuelve una lambda, pero no la ejecuta.
La función first devuelve una función { println("first")} .
Llamar first() no hace nada, ni siquiera se captura su argumento de retorno.
Sin una lambda sería un equivalente, tal vez sea más fácil de entender de esta forma:
fun firstWithoutLambda() = fun() { println("first w/o lambda")}Para llamarlos:
first().invoke() firstWithoutLambda().invoke()que imprimirá los mensajes que esperaría.
Del tutorial original de Kotlin, un buen artículo: https://kotlinlang.org/docs/reference/lambdas.html
Es muy sencillo. Verifique los tipos de esos:
fun first(): () -> Unit = { println("first") } fun second(): Unit = println("second") Entonces, cuando llamas first , obtienes la expresión lamda. Para invocar esta función, use .invoke() (o simplemente () ):
first().invoke() // or first()()El segundo es obvio: se ejecuta en la llamada.