Sobes.tech
Middle+

¿Para qué se utiliza el modificador `crossinline` en Kotlin?

sobes.tech AI

Respuesta de la IA

El modificador crossinline se utiliza para marcar los parámetros lambda de funciones inline.

Indica al compilador que la lambda correspondiente no puede realizar un retorno no local (non-local return), es decir, usar la instrucción return para salir de la función externa. Sin embargo, la lambda aún puede ser insertada (inlined) en el lugar de la llamada.

Ejemplo:

// Función inline normal con retorno no local
inline fun runTask(task: () -> Unit) {
    task() // Se permite un retorno no local desde task()
    println("Tarea finalizada")
}

// Función inline con parámetro crossinline
inline fun runSafeTask(crossinline task: () -> Unit) {
    // Bloque try-finally como ejemplo, donde se necesita crossinline
    try {
        task() // NO se permite un retorno no local desde task()
    } finally {
        println("Limpieza")
    }
    println("Tarea segura finalizada")
}

fun main() {
    // Uso de runTask
    runTask {
        println("Dentro de lambda de runTask")
        return // PERMITIDO: retorno no local desde main()
    }
    // La impresión "Tarea finalizada" NO se ejecutará

    // Uso de runSafeTask
    runSafeTask {
        println("Dentro de lambda de runSafeTask")
        // return // ERROR DE COMPILACIÓN: retorno no local prohibido
    }
    println("Después de la tarea segura") // Esta impresión se ejecutará
}

Cuándo es útil:

  • Cuando se necesita garantizar que el código después de la llamada a la lambda crossinline se ejecute (por ejemplo, en bloques try-finally).
  • Cuando la lambda se pasa como argumento a otra función que puede no ser inline, y se desea evitar un retorno no local que podría interrumpir el flujo de ejecución.