Middle+
За какво се използва модификаторът `crossinline` в Kotlin?
sobes.tech AI
Отговор от AI
Модификаторът crossinline се използва за маркиране на параметри lambda на inline функции.
Той указва на компилатора, че съответната lambda не може да извършва non-local return (т.е. да използва командата return за изход от външната функция). Въпреки това, lambda все още може да бъде вмъкната (inlined) на мястото на извикване.
Пример:
// Обикновена inline функция с non-local return
inline fun runTask(task: () -> Unit) {
task() // Възможен е non-local return от task()
println("Задачата е завършена")
}
// inline функция с crossinline параметър
inline fun runSafeTask(crossinline task: () -> Unit) {
// try-finally блок като пример, където е необходим crossinline
try {
task() // НЕ е позволено да се направи non-local return от task()
} finally {
println("Почистване")
}
println("Безопасна задача завършена")
}
fun main() {
// Използване на runTask
runTask {
println("Вътре в lambda на runTask")
return // ДОПУСТИМО: non-local return от main()
}
// Ще не се изпълни принтирането "Задачата е завършена"
// Използване на runSafeTask
runSafeTask {
println("Вътре в lambda на runSafeTask")
// return // Грешка при компилация: забранен е non-local return
}
println("След безопасната задача") // Този принт ще бъде изпълнен
}
Кога е полезно:
- Когато искате да гарантирате, че кодът след извикването на
crossinlinelambda ще бъде изпълнен (например, вtry-finallyблокове). - Когато lambda се предава като аргумент към друга функция, която може да не е inline, и искате да предотвратите non-local return, който може да наруши потока на изпълнение.