tutorial programar libro español documentación descargar con aprende kotlin

programar - Retorno implícito de lambda en Kotlin



libro kotlin español pdf (1)

Parece que la última línea de un lambda siempre devuelve ese valor, incluso si omite la declaración de return . ¿Es esto correcto? ¿Está documentado en alguna parte?

fun main(args: Array<String>) { val nums = arrayOf(1, 2, 3) val numsPlusOne = nums.map { it -> val r = it + 1 r } // numsPlusOne = [2, 3, 4] }


Sí, esto es correcto, si la última declaración de un lambda es una expresión, se considera su valor de retorno.

@KirillRakhman es lo que dice la referencia (gracias @KirillRakhman ):

Podemos devolver explícitamente un valor desde la lambda usando la sintaxis de devolución calificada . De lo contrario, el valor de la última expresión se devuelve implícitamente. Por lo tanto, los dos fragmentos siguientes son equivalentes:

ints.filter { val shouldFilter = it > 0 shouldFilter }

ints.filter { val shouldFilter = it > 0 return@filter shouldFilter }

La última semántica de las afirmaciones también es válida para if (por eso no hay un operador ternario) , when y try-catch bloques try-catch , y estas sentencias son expresiones en sí mismas:

val foo = if (bar) { doSomething() baz } else { doSomethingElse() qux }

Ver también: ejemplos para when y try - catch .

Así, las lambdas son consistentes con las construcciones del lenguaje a este respecto.

Si desea realizar una declaración de return explícita en un lambda, use la sintaxis de return@label (también, otra respuesta con ejemplos ). Por el contrario, el return no etiquetado funciona con la fun más cercana (ignorando las lambdas) y, por lo tanto, solo puede ocurrir en aquellas lambdas que están en inlined .

Hubo una propuesta de lenguaje para agregar una sintaxis especial para emitir un valor desde un bloque de código, pero se rechazó.