Что происходит при использовании return в лямбде внутри inline-функции?

Компилятор выполняет inline-функцию за счёт встраивания её кода оператор return из лямбды в inline-функции выполняет non-local return то есть он завершает не лямбду, а внешнюю функцию, в которой расположен вызов…

Короткий ответ

Что ответить на собеседовании

Компилятор выполняет inline-функцию за счёт встраивания её кода оператор return из лямбды в inline-функции выполняет non-local return то есть он завершает не лямбду, а внешнюю функцию, в которой расположен вызов inline-функции такое поведение доступно только для inline-функций: оно позволяет избежать накладных расходов и выполнить прямой выход если требуется локально выйти лишь из лямбды, применяют return@label или anonymous functions non-local return позволяет из лямбды остановить выполнение внешней функции это помогает писать лаконичный и понятный код без дополнительных условий и флагов

Подробный разбор

Ответ с пояснениями

Что происходит при использовании return в лямбде внутри inline-функции?

  • Компилятор выполняет inline-функцию за счёт встраивания её кода
  • оператор return из лямбды в inline-функции выполняет non-local return
  • то есть он завершает не лямбду, а внешнюю функцию, в которой расположен вызов inline-функции
  • такое поведение доступно только для inline-функций: оно позволяет избежать накладных расходов и выполнить прямой выход
  • если требуется локально выйти лишь из лямбды, применяют return@label или anonymous functions
  • non-local return позволяет из лямбды остановить выполнение внешней функции
  • это помогает писать лаконичный и понятный код без дополнительных условий и флагов

Итог: return в лямбде внутри inline-функции прекращает выполнение внешней функции, а не только самой лямбды.

Подробный ответ

Основной ответ

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

Ключевые моменты

  • При non-local return в inline-функции оператор обычно покидает лямбду: return в обычном случае выходит из неё, однако в inline-контексте return передаёт управление за пределы всей inline-функции. В не-inline-контексте это невозможно.
  • Если нужно завершить только лямбду, используют локальный return с меткой, например return@lambda. Такой выход останавливает выполнение лямбды, но не внешней функции.
  • Для нем-inline функций такое поведение недоступно: оператор return внутри лямбды выступает как обычный возврат из неё (local return). Причина в том, что тело лямбды не встраивается в функцию, которая её вызывает.

Практический контекст

На практике return внутри лямбд inline-функций встречается, например, в функциях forEach, filter, map стандартной библиотеки Kotlin: обычный return позволяет досрочно остановить обход. Так, в inline fun forEach(action: (T) -> Unit) использование return внутри action полностью прерывает выполнение forEach.

Итак, для корректной работы с лямбдами и inline-функциями в Kotlin важно различать local и non-local return. Это особенно значимо при управлении потоком выполнения, чтобы избежать неожиданных досрочных выходов из функций.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку