← Назад к вопросам

Что такое return в inline?

3.0 Senior🔥 71 комментариев
#Kotlin основы#Производительность и оптимизация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Значение return в inline-функциях Kotlin

return внутри inline-функций в Kotlin ведёт себя особым образом — он может совершать нелокальный возврат (non-local return) из внешней функции. Это прямое следствие механизма inline-подстановки: тело inline-функции "встраивается" в место вызова, поэтому return внутри такого блока относится к вызывающей функции, а не к самой inline-функции.

Как это работает

Когда компилятор обрабатывает вызов inline-функции, он заменяет его непосредственно телом функции. Таким образом, инструкции return становятся частью кода вызывающей функции.

inline fun forEachInline(action: (Int) -> Unit) {
    for (i in 1..3) action(i)
}

fun main() {
    forEachInline { value ->
        println(value)
        if (value == 2) return // Нелокальный return из main()
    }
    println("Эта строка не будет выполнена")
}

После компиляции код main будет эквивалентен примерно следующему:

fun main() {
    for (i in 1..3) {
        println(i)
        if (i == 2) return
    }
    println("Эта строка не будет выполнена")
}

Ограничение: перекрестная инлайнизация (crossinline)

Если lambda-параметр inline-функции помечен модификатором crossinline, нелокальный return внутри такой lambda становится запрещённым. Это требуется, когда lambda может быть выполнена не напрямую, а в другом контексте (например, сохранена или передана дальше).

inline fun executeCrossinline(crossinline block: () -> Unit) {
    Runnable { block() }.run() // lambda выполняется внутри Runnable
}

fun main() {
    executeCrossinline {
        println("Выполняем")
        // return // ОШИБКА КОМПИЛЯЦИИ: Can't inline 'return' here
        return@executeCrossinline // Только локальный return разрешён
    }
}

Ключевые особенности

  • Нелокальный возврат — главная особенность, позволяющая выйти из внешней функции.
  • Локальный возврат с использованием метки (например, return@forEach) всегда возможен и возвращает только из lambda.
  • Crossinline ограничивает использование нелокального return, но сохраняет другие преимущества inline-подстановки.

Практическое применение

Такое поведение активно используется в стандартной библиотеке Kotlin для функций высшего порядка, таких как forEach:

listOf(1, 2, 3).forEach {
    if (it == 2) return // Выход из внешней функции
}

Таким образом, return в inline-функциях — это мощный механизм, который, с одной стороны, предоставляет гибкость управления потоком выполнения, а с другой — требует внимательности от разработчика, чтобы избежать неожиданных завершений функции. Понимание разницы между локальным и нелокальным возвратом критически важно для написания корректного и безопасного кода с использованием inline-функций в Kotlin.

Что такое return в inline? | PrepBro