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")
}