Назад к вопросам
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")
}