Middle+
Kotlin-də crossinline açar sözü nə üçün istifadə olunur?
sobes.tech Süni İntellekt
AI-dan cavab
Kotlin'de crossinline, inline funksiyalarda parametr kimi işarələnmişdir. Bu, belə bir lambda parametrinin iç-içə funksiyalar (məsələn, anonim sinif obyektləri kimi) daxilində çağırılmasına imkan verir və bu funksiyalar inline deyil.
Adi lambda'lar inline funksiyalarda, lokal olmayan geri dönüşləri (xarici funksiyadan çıxan geri dönüşlər) ehtiva edə bilər. crossinline ilə işarələnmiş lambda, lokal olmayan geri dönüşləri ehtiva edə bilməz.
Əsas məqsəd:
- Lambda'nın, standart inline lambda (lokal olmayan geri dönüş imkanı ilə) istifadə edilə bilməyən kontekstlərdə istifadə olunmasına imkan yaratmaq (məsələn, anonim obyektlər, yerli funksiyalar).
- Kod strukturuna görə, lambda'dan lokal olmayan geri dönüşləri qarşısını almaq (məsələn, lambda'nın başqa bir thread-ə ötürülməsi zamanı).
Nümunə:
inline fun runAsyncAndFinish(crossinline block: () -> Unit) {
// Anonim Runnable obyekti yaratmaq
val runnable = object : Runnable {
override fun run() {
block() // crossinline lambda'nın içində istifadə
// burada block() runAsyncAndFinish'dən lokal olmayan geri dönüş edə bilməz
}
}
// Ayrı bir thread-də işə salmaq (nümunə)
Thread(runnable).start()
// əgər block crossinline olmasaydı, block() runAsyncAndFinish'dən geri dönüş edə bilərdi
// bu, başqa bir thread-dən mümkün deyil
}
fun testCrossinline() {
println("RunAsyncAndFinish'dən əvvəl")
runAsyncAndFinish {
println("Asinxron blok daxilində")
// return // Kompilyasiya xətası: crossinline ilə lokal olmayan geri dönüş istifadə edilə bilməz
}
println("RunAsyncAndFinish'dən sonra")
}