Middle+
Модификатори `crossinline` дар Kotlin барои чӣ истифода мешавад?
sobes.tech AI
Ҷавоб аз AI
Модификатори crossinline истифода мешавад барои нишон додани параметрҳои lambda дар функсияҳои inline.
Ин ба компилятор нишон медиҳад, ки lambda-роҳояти дахлдор наметавонад non-local return (яъне, истифодаи фармони return барои хориҷ шудан аз функсияи беруна) кунад. Аммо, lambda ҳоло ҳам метавонад дар ҷойи даъват inlined шавад (inlined).
Масалан:
// Функсияи inline оддӣ бо қайти ғайриҳолӣ
inline fun runTask(task: () -> Unit) {
task() // Қайти ғайриҳолӣ аз task() имконпазир аст
println("Вазифа анҷом ёфт")
}
// Функсияи inline бо параметри crossinline
inline fun runSafeTask(crossinline task: () -> Unit) {
// блок try-finally ҳамчун мисол, ки дар он crossinline зарур аст
try {
task() // НАДОИСТ, ки аз task() қайти ғайриҳолӣ накунед
} finally {
println("Тоза кардан")
}
println("Вазифаи бехатар анҷом ёфт")
}
fun main() {
// Истифодаи runTask
runTask {
println("Дар дохили lambda-и runTask")
return // ИЗЗАТ: қайти ғайриҳолӣ аз main()
}
// Намоиши "Вазифа анҷом ёфт" НАМЕОЯТ
// Истифодаи runSafeTask
runSafeTask {
println("Дар дохили lambda-и runSafeTask")
// return // ХАТОИ КОМПИЛЯТОР: қайти ғайриҳолӣ манъ аст
}
println("Пас аз вазифаи бехатар") // Ин нусха иҷро мешавад
}
Вақте ки ин муфид аст:
- Вақте, ки мехоҳед, ки пас аз даъвати lambda-и
crossinlineкоди иҷро шавад (масалан, дар блокҳоиtry-finally). - Вақте, ки lambda ҳамчун аргумент ба функсияи дигар дода мешавад, ки шояд inline набошад, ва шумо мехоҳед, ки қайти ғайриҳолӣ манъ карда шавад, ки метавонад ҷараёни иҷроиро вайрон кунад.