Sobes.tech
Middle+

K čemu slouží klíčové slovo crossinline v Kotlinu?

sobes.tech AI

Odpověď od AI

crossinline se používá v Kotlinu k označení parametrů funkcí v inline funkcích. To umožňuje volat takový lambda parametr uvnitř vnořených funkcí (například objektů anonymních tříd), které nejsou inline.

Obvyklé lambdy v inline funkcích mohou obsahovat nelokální návraty (návraty, které opouštějí vnější funkci). Lambda označená crossinline nemůže obsahovat nelokální návraty.

Hlavní účel:

  • Umožnit použití lambda v kontextech, kde výchozí inline lambda (s možností nelokálního návratu) nemůže být použita (například anonymní objekty, místní funkce).
  • Zabránit nelokálním návratům z lambda, když je to nežádoucí nebo nemožné kvůli struktuře kódu (například při předávání lambda jinému vláknu).

Příklad:

inline fun runAsyncAndFinish(crossinline block: () -> Unit) {
    // Vytvoření anonymního objektu Runnable
    val runnable = object : Runnable {
        override fun run() {
            block() // Použití crossinline lambda uvnitř
            // zde block() nemůže provést nelokální návrat z runAsyncAndFinish
        }
    }
    // Spuštění v samostatném vlákně (příklad)
    Thread(runnable).start()
    // pokud by block nebyl crossinline, block() by mohl udělat return z runAsyncAndFinish
    // což není možné z jiného vlákna než volajícího
}

fun testCrossinline() {
    println("Před runAsyncAndFinish")
    runAsyncAndFinish {
        println("Uvnitř asynchronního bloku")
        // return // Chyba kompilace: nelze použít nelokální return s crossinline
    }
    println("Po runAsyncAndFinish")
}