Middle+
Ключвожаии crossinline дар Kotlin барои чӣ истифода мешавад?
sobes.tech AI
Ҷавоб аз AI
crossinline дар Kotlin истифода мешавад барои нишон додани параметрҳои функсия дар функсияҳои inline. Ин имкон медиҳад, ки чунин параметри lambda дар дохили функсияҳои дарунсохт (масалан, объектҳои синфи номаълум) даъват карда шаванд, ки inline нестанд.
Lambda-ҳои оддӣ дар функсияҳои inline метавонанд баргардониҳои ғайри маҳаллӣ (баргардониҳое, ки аз функсияи беруна мебароянд) дошта бошанд. Lambda, ки бо crossinline ишора шудааст, наметавонад баргардониҳои ғайри маҳаллӣ дошта бошад.
Мақсади асосӣ:
- Иҷозат додан ба истифодаи lambda дар контекстҳое, ки lambda-ҳои inline бо имконияти баргардониҳои ғайри маҳаллӣ (ба монанди, объектҳои номаълум, функсияҳои маҳаллӣ) истифода намешаванд.
- Манъ кардани баргардониҳои ғайри маҳаллӣ аз lambda вақте, ки ин нолозим ё номумкин аст бо сабаби сохтори коди (масалан, ҳангоми интиқоли lambda ба дигар ҷараён).
Масалан:
inline fun runAsyncAndFinish(crossinline block: () -> Unit) {
// Эҷоди объекти номаълум Runnable
val runnable = object : Runnable {
override fun run() {
block() // Истифодаи lambda-и crossinline дар дохил
// дар ин ҷо block() наметавонад баргардониҳои ғайри маҳаллӣ аз runAsyncAndFinish анҷом диҳад
}
}
// оғоз дар ҷараёни алоҳида (масалан)
Thread(runnable).start()
// агар block набошад crossinline, block() метавонист баргардониро аз runAsyncAndFinish анҷом диҳад
// ки аз ҷараёни дигар, ки даъват мекунад, имконнопазир аст
}
fun testCrossinline() {
println("Пеш аз runAsyncAndFinish")
runAsyncAndFinish {
println("Дар дохили блоки асинхрон")
// return // Хатои компилятсия: истифодаи баргардони ғайри маҳаллӣ бо crossinline манъ аст
}
println("Пас аз runAsyncAndFinish")
}