Назад к вопросам
Middle+
120
questionbank
Для чего используется ключевое слово crossinline в Kotlin?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
crossinline используется в Kotlin для маркировки параметров-функций в инлайн-функциях. Это позволяет вызывать такой лямбда-параметр внутри вложенных функций (таких как объекты анонимных классов), которые не являются инлайн.
Обычные лямбды в инлайн-функциях могут содержать нелокальные возвраты (возвраты, выходящие из внешней функции). Лямбда, помеченная crossinline, не может содержать нелокальных возвратов.
Основное назначение:
- Позволить использовать лямбду в контекстах, где инлайн-лямбда по умолчанию (с возможностью нелокального возврата) не может быть использована (например, анонимные объекты, локальные функции).
- Предотвратить нелокальные возвраты из лямбды, когда это нежелательно или невозможно из-за структуры кода (например, при передаче лямбды другому потоку).
Пример:
inline fun runAsyncAndFinish(crossinline block: () -> Unit) {
// Создание анонимного объекта Runnable
val runnable = object : Runnable {
override fun run() {
block() // Использование crossinline лямбды внутри
// здесь block() не может совершить нелокальный возврат из runAsyncAndFinish
}
}
// Запуск в отдельном потоке (пример)
Thread(runnable).start()
// если бы block была не crossinline, block() мог бы сделать return из runAsyncAndFinish
// что невозможно из потока, отличного от вызывающего
}
fun testCrossinline() {
println("Before runAsyncAndFinish")
runAsyncAndFinish {
println("Inside async block")
// return // Ошибка компиляции: нельзя использовать нелокальный return с crossinline
}
println("After runAsyncAndFinish")
}