Можно ли сделать non-local return в crossinline функции в Kotlin

«Можно ли сделать non-local return в crossinline функции в Kotlin» — вопрос из категории Kotlin, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, non-local return (возврат из внешней функции) невозможен в crossinline функциях.

Причина: crossinline запрещает нелокальные возвраты, так как такие функции могут выполняться вне контекста вызывающей функции (например, в другом потоке или после завершения родительской функции).

Пример:

inline fun runCrossinline(crossinline block: () -> Unit) {
    block()
}

fun test() {
    runCrossinline {
        return // Ошибка компиляции: "Can't inline 'return' here"
    }
}

Для локальных возвратов используйте return@label:

runCrossinline {
    return@runCrossinline // Локальный возврат
}