Sobes.tech
Middle+

Na čo sa používa kľúčové slovo crossinline v Kotlin?

sobes.tech AI

Odpoveď od AI

crossinline sa v Kotlinu sa používa na označenie parametrov funkcií v inline funkciách. To umožňuje volať takýto lambda parameter vo vnútri vnorených funkcií (napríklad objektov anonymných tried), ktoré nie sú inline.

Bežné lambdy v inline funkciách môžu obsahovať nelokálne návraty (návraty, ktoré opúšťajú vonkajšiu funkciu). Lambda označená ako crossinline nemôže obsahovať nelokálne návraty.

Hlavný účel:

  • Umožniť použitie lambda v kontextoch, kde predvolené inline lambda (s možnosťou nelokálneho návratu) nemôže byť použitá (napríklad anonymné objekty, lokálne funkcie).
  • Zabrániť nelokálnym návratom z lambda, keď je to neželané alebo nemožné kvôli štruktúre kódu (napríklad pri odovzdávaní lambda inému vláknu).

Príklad:

inline fun runAsyncAndFinish(crossinline block: () -> Unit) {
    // Vytvorenie anonymného objektu Runnable
    val runnable = object : Runnable {
        override fun run() {
            block() // Použitie crossinline lambda vo vnútri
            // tu block() nemôže vykonať nelokálny návrat z runAsyncAndFinish
        }
    }
    // Spustenie v samostatnom vlákne (príklad)
    Thread(runnable).start()
    // ak by block nebol crossinline, block() by mohol urobiť return z runAsyncAndFinish
    // čo nie je možné z iného vlákna, než je volajúce
}

fun testCrossinline() {
    println("Pred runAsyncAndFinish")
    runAsyncAndFinish {
        println("Vnútri asynchrónneho bloku")
        // return // Chyba kompilácie: nie je možné použiť nelokálny return s crossinline
    }
    println("Po runAsyncAndFinish")
}