Middle+
Zašto se koristi modifikator `crossinline` u Kotlinu?
sobes.tech АИ
Одговор од АИ
Modifikator crossinline se koristi za označavanje parametara lambda inline funkcija.
On ukazuje kompilatoru da odgovarajuća lambda ne može da izvrši non-local return (tj. da koristi naredbu return za izlazak iz spoljne funkcije). Međutim, lambda i dalje može biti umetnuta (inlined) na mestu poziva.
Primer:
// Obična inline funkcija sa non-local return
inline fun runTask(task: () -> Unit) {
task() // Non-local return iz task() je moguć
println("Zadatak završen")
}
// inline funkcija sa crossinline parametrom
inline fun runSafeTask(crossinline task: () -> Unit) {
// try-finally blok kao primer, gde je potreban crossinline
try {
task() // NIJE dozvoljeno da se uradi non-local return iz task()
} finally {
println("Čišćenje")
}
println("Siguran zadatak završen")
}
fun main() {
// Korišćenje runTask
runTask {
println("Unutar lambda od runTask")
return // DOZVOLJENO: non-local return iz main()
}
// Ispis "Zadatak završen" neće biti izvršen
// Korišćenje runSafeTask
runSafeTask {
println("Unutar lambda od runSafeTask")
// return // GREŠKA KOMPLAJERA: zabranjen non-local return
}
println("Posle sigurnog zadatka") // Ovaj ispis će biti izvršen
}
Kada je korisno:
- Kada želite da osigurate da će kod nakon poziva
crossinlinelambda biti izvršen (npr. utry-finallyblokovima). - Kada se lambda prosleđuje kao argument drugoj funkciji koja možda nije inline, i želite da sprečite non-local return koji bi mogao prekinuti tok izvršenja.