Sobes.tech
Middle+

Na čo slúži modifikátor `crossinline` v Kotlin?

sobes.tech AI

Odpoveď od AI

Modifikátor crossinline se koristi za označavanje parametrov lambda inline funkcií.

Indikuje prekladaču, že príslušná lambda nemôže vykonať non-local return (t.j. použiť príkaz return na opustenie vonkajšej funkcie). Lambda však stále môže byť vložená (inlined) na mieste volania.

Príklad:

// Bežná inline funkcia s non-local return
inline fun runTask(task: () -> Unit) {
    task() // Non-local return z task() je možný
    println("Úloha dokončená")
}

// inline funkcia s parametrom crossinline
inline fun runSafeTask(crossinline task: () -> Unit) {
    // try-finally blok ako príklad, kde je potrebný crossinline
    try {
        task() // NIE je povolené robiť non-local return z task()
    } finally {
        println("Upratovanie")
    }
    println("Bezpečné dokončenie úlohy")
}

fun main() {
    // Použitie runTask
    runTask {
        println("Vnútri lambda od runTask")
        return // POVOLENÉ: non-local return z main()
    }
    // "Úloha dokončená" sa NEbude vykonávať

    // Použitie runSafeTask
    runSafeTask {
        println("Vnútri lambda od runSafeTask")
        // return // CHYBA KOMPILÁTORU: zakázaný non-local return
    }
    println("Po bezpečnej úlohe") // Tento výpis bude vykonaný
}

Kedy je to užitočné:

  • Keď chcete zabezpečiť, že kód po volaní crossinline lambda bude vykonaný (napríklad v try-finally blokoch).
  • Keď lambda je odovzdaná ako argument inej funkcie, ktorá nemusí byť inline, a chcete zabrániť non-local return, ktorý by mohol narušiť tok vykonávania.