Назад к вопросам
Middle+
73
questionbank
Зачем используется модификатор `crossinline` в Kotlin?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Модификатор crossinline используется для маркировки лямбда-параметров inline-функций.
Он указывает компилятору, что соответствующая лямбда-функция не может выполнять нелокальный возврат (non-local return), то есть использовать оператор return для выхода из внешней функции. При этом лямбда все еще может быть встроена (inlined) в месте вызова.
Пример:
// Обычная inline-функция с нелокальным возвратом
inline fun runTask(task: () -> Unit) {
task() // Нелокальный возврат возможен из task()
println("Task finished")
}
// inline-функция с crossinline параметром
inline fun runSafeTask(crossinline task: () -> Unit) {
// try-finally блок для примера, где нужен crossinline
try {
task() // НЕльзя сделать нелокальный возврат из task()
} finally {
println("Cleanup")
}
println("Safe task finished")
}
fun main() {
// Использование runTask
runTask {
println("Inside runTask lambda")
return // ДОПУСТИМО: нелокальный возврат из main()
}
// Принт "Task finished" НЕ будет выполнен
// Использование runSafeTask
runSafeTask {
println("Inside runSafeTask lambda")
// return // ОШИБКА КОМПИЛЯЦИИ: нелокальный возврат запрещен
}
println("After safe task") // Этот принт будет выполнен
}
Когда это полезно:
- Когда нужно гарантировать, что код после вызова
crossinlineлямбда-функции будет выполнен (например, вtry-finallyблоках). - Когда лямбда передается как аргумент в другую функцию, которая может не быть встроенной, и вы хотите предотвратить нелокальный возврат, который мог бы нарушить поток выполнения.