Middle+
Pentru ce este folosit cuvântul cheie crossinline în Kotlin?
sobes.tech AI
Răspuns de la AI
crossinline este utilizat în Kotlin pentru a marca parametrii funcțiilor în funcții inline. Acest lucru permite apelarea unui astfel de parametru lambda în interiorul funcțiilor imbricate (cum ar fi obiecte de clase anonime) care nu sunt inline.
Lambda-urile normale din funcțiile inline pot conține returnări non-locale (returnări care ies din funcția exterioară). O lambda marcată cu crossinline nu poate conține returnări non-locale.
Scop principal:
- Permite utilizarea unei lambda în contexte în care o lambda inline implicită (cu posibilitatea de returnare non-locală) nu poate fi utilizată (de exemplu, obiecte anonime, funcții locale).
- Previne returnările non-locale din lambda atunci când acest lucru nu este dorit sau nu este posibil din cauza structurii codului (de exemplu, la transmiterea unei lambda către un alt fir de execuție).
Exemplu:
inline fun runAsyncAndFinish(crossinline block: () -> Unit) {
// Crearea unui obiect Runnable anonim
val runnable = object : Runnable {
override fun run() {
block() // Utilizarea lambda-ului crossinline în interior
// aici block() nu poate face un return non-local din runAsyncAndFinish
}
}
// Pornirea într-un fir de execuție separat (exemplu)
Thread(runnable).start()
// dacă block nu ar fi crossinline, block() ar putea face un return din runAsyncAndFinish
// ceea ce nu este posibil dintr-un fir de execuție diferit de cel care a apelat
}
fun testCrossinline() {
println("Înainte de runAsyncAndFinish")
runAsyncAndFinish {
println("În interiorul blocului asincron")
// return // Eroare de compilare: nu se poate folosi return non-local cu crossinline
}
println("După runAsyncAndFinish")
}