Назад к вопросам
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 блоках).
  • Когда лямбда передается как аргумент в другую функцию, которая может не быть встроенной, и вы хотите предотвратить нелокальный возврат, который мог бы нарушить поток выполнения.