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

Лямбда без встраивания в Kotlin

У встраиваемой функции может быть несколько параметров-лямбд. Не каждый из них удобно разворачивать: иногда блок нужно сохранить или передать дальше, и тогда его нельзя просто вставить в вызывающий код.

Такой параметр помечают словом noinline перед именем. Остальные лямбды при этом могут встраиваться как обычно. Схема на двух блоках:

inline fun runNowAndLater( now: () -> Unit, noinline later: () -> Unit, ) { now() pending += later } val pending = mutableListOf<() -> Unit>()

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

fun main() { runNowAndLater( now = { println("setup") }, later = { println("cleanup") }, ) pending.forEach { step -> step() } }

Объявите функцию с двумя лямбда-параметрами: первую выполните сразу, вторую добавьте в список отложенных шагов. В main зарегистрируйте пару блоков и затем выполните все отложенные по порядку.

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

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