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