В Kotlin inline функции оптимизируют производительность, заменяя места вызова lambda на само тело lambda. Модификаторы crossinline и noinline настраивают это поведение, когда стандартный инлайнинг не подходит.
noinlinenoinline полностью предотвращает инлайнинг конкретного параметра lambda. Lambda остаётся обычным объектом функции.
Используй noinline, когда нужно:
inline fun example(inlined: () -> Unit, noinline stored: () -> Unit) {
someList.add(stored) // возможно только потому, что stored — noinline
inlined()
}
crossinlinecrossinline позволяет инлайнить lambda, но запрещает нелокальные return'ы из неё. Это требуется, когда lambda вызывается в контексте, где нелокальные return'ы были бы небезопасны — например, внутри другой lambda или в отличающемся контексте выполнения.
inline fun example(crossinline action: () -> Unit) {
runOnUiThread {
action() // безопасно: crossinline предотвращает нелокальный return
}
}
Без crossinline вызывающий код мог бы написать return внутри action, что попыталось бы вернуться из внешней функции — а это недопустимо.
noinline | crossinline | |
|---|---|---|
| Lambda инлайнится | Нет | Да |
| Нелокальные return'ы | Не применяется | Запрещены |
| Можно сохранить/передать | Да | Нет |
noinline, когда lambda должна рассматриваться как переиспользуемый объектcrossinline, когда lambda инлайнится, но вызывается косвенно (например, внутри другой lambda или callback'а)Модификатор noinline предотвращает встраивание лямбды и позволяет ей храниться в переменных или передаваться другим функциям.
Новый — ещё не проверен сообществом
Вы