Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗ktSpIlCr 115 of 299 menu
◀ ▶

Запрет внешнего возврата в Kotlin

Встраиваемая функция может передать лямбду дальше - например, в другой метод, который вызовет ее позже или из другого контекста. В такой вложенной точке нелокальный return уже не имеет ясной внешней функции.

Параметр, который уходит во вложенный вызов, помечают crossinline. Лямбда по-прежнему разворачивается, но return из ее тела не может завершить функцию, объявленную снаружи обертки:

inline fun onReady(crossinline action: () -> Unit) { readyQueue.add { action() } } val readyQueue = mutableListOf<() -> Unit>() fun drainReady() { readyQueue.forEach { step -> step() } readyQueue.clear() }

Блок попадает в список через еще одну лямбду. Без ограничения crossinline компилятор не разрешил бы такую цепочку из-за риска нелокального выхода. Локальный return внутри переданного блока по-прежнему относится только к этому блоку. Проверка с простым текстом:

fun main() { onReady { println("loaded") } drainReady() }

Сделайте функцию, которая регистрирует лямбду в списке задач и вызывает ее позже через отдельный метод runTasks. Убедитесь, что блок выполняется после регистрации.

Добавьте вторую обертку: она принимает лямбду и передает ее в repeat с фиксированным числом повторений 3. Выведите одну строку "ping" ровно три раза.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить