Sobes.tech
Middle+

K čemu slouží modifikátor `crossinline` v Kotlinu?

sobes.tech AI

Odpověď od AI

Modifikátor crossinline se používá k označení parametrů lambda funkcí inline.

Indikuje překladači, že odpovídající lambda nem může provádět non-local return (tedy použití příkazu return k opuštění vnější funkce). Lambda však stále může být vložena (inlined) na místě volání.

Příklad:

// Normální inline funkce s non-local return
inline fun runTask(task: () -> Unit) {
    task() // Non-local return z task() je možný
    println("Úkol dokončen")
}

// inline funkce s parametrem crossinline
inline fun runSafeTask(crossinline task: () -> Unit) {
    // blok try-finally jako příklad, kde je potřeba crossinline
    try {
        task() // NENÍ povoleno dělat non-local return z task()
    } finally {
        println("Úklid")
    }
    println("Bezpečné dokončení úkolu")
}

fun main() {
    // Použití runTask
    runTask {
        println("Uvnitř lambda runTask")
        return // POVOLENO: non-local return z main()
    }
    // Tisk "Úkol dokončen" nebude proveden

    // Použití runSafeTask
    runSafeTask {
        println("Uvnitř lambda runSafeTask")
        // return // CHYBA KOMPILACE: zakázaný non-local return
    }
    println("Po bezpečném úkolu") // Tento tisk bude proveden
}

Kdy je to užitečné:

  • Když chcete zajistit, že kód po volání lambda crossinline bude proveden (například v blocích try-finally).
  • Když lambda je předávána jako argument jiné funkci, která nemusí být inline, a chcete zabránit non-local return, který by mohl narušit tok provádění.