Middle+
Kam skirta `crossinline` modifikatoriaus naudojimas Kotlin'e?
sobes.tech AI
Atsakymas iš AI
crossinline keitiklis naudojamas inline funkcijų lambda parametrų žymėjimui.
Jis nurodo kompiliatoriui, kad atitinkama lambda negali atlikti non-local return (t.y., naudoti return teiginį išeiti iš išorinės funkcijos). Tačiau lambda vis dar gali būti įterpta (inlined) į iškvietimo vietą (inlined).
Pavyzdys:
// Įprasta inline funkcija su non-local return
inline fun runTask(task: () -> Unit) {
task() // Non-local return iš task() yra įmanomas
println("Užduotis baigta")
}
// inline funkcija su crossinline parametru
inline fun runSafeTask(crossinline task: () -> Unit) {
// try-finally blokas kaip pavyzdys, kur reikalingas crossinline
try {
task() // NEleidžiama atlikti non-local return iš task()
} finally {
println("Valymas")
}
println("Saugus užduoties pabaiga")
}
fun main() {
// Naudojimas su runTask
runTask {
println("Viduje lambda iš runTask")
return // LEIDŽIAMA: non-local return iš main()
}
// "Užduotis baigta" nebus išspausdinta
// Naudojimas su runSafeTask
runSafeTask {
println("Viduje lambda iš runSafeTask")
// return // KLAIDA: draudžiama non-local return
}
println("Po saugios užduoties") // Šis spausdinimas bus atliktas
}
Kada tai naudinga:
- Kai norite užtikrinti, kad kodas po
crossinlinelambda iškvietimo bus vykdomas (pvz.,try-finallyblokuose). - Kai lambda perduodama kaip argumentas kitai funkcijai, kuri gali būti ne inline, ir norite išvengti non-local return, kuris galėtų sutrikdyti vykdymo srautą.