Sobes.tech
Middle+

¿Para qué se utiliza la palabra clave crossinline en Kotlin?

sobes.tech AI

Respuesta de la IA

crossinline se usa en Kotlin para marcar parámetros de funciones en funciones en línea. Esto permite llamar a dicho parámetro lambda dentro de funciones anidadas (como objetos de clases anónimas) que no son en línea.

Los lambdas normales en funciones en línea pueden contener retornos no locales (retornos que salen de la función externa). Un lambda marcado con crossinline no puede contener retornos no locales.

Propósito principal:

  • Permitir usar un lambda en contextos donde un lambda en línea por defecto (con la capacidad de retorno no local) no puede ser utilizado (por ejemplo, objetos anónimos, funciones locales).
  • Prevenir retornos no locales desde el lambda cuando esto no es deseable o posible debido a la estructura del código (por ejemplo, al pasar un lambda a otro hilo).

Ejemplo:

inline fun runAsyncAndFinish(crossinline block: () -> Unit) {
    // Crear un objeto anónimo Runnable
    val runnable = object : Runnable {
        override fun run() {
            block() // Uso de lambda crossinline dentro
            // aquí block() no puede hacer un retorno no local desde runAsyncAndFinish
        }
    }
    // Ejecutar en un hilo separado (ejemplo)
    Thread(runnable).start()
    // si block no fuera crossinline, block() podría hacer un return desde runAsyncAndFinish
    // lo cual no es posible desde un hilo diferente al que llama
}

fun testCrossinline() {
    println("Antes de runAsyncAndFinish")
    runAsyncAndFinish {
        println("Dentro del bloque asíncrono")
        // return // Error de compilación: no se puede usar return no local con crossinline
    }
    println("Después de runAsyncAndFinish")
}