Что такое inline функция в Kotlin
Что проверяют
Понимаете ли вы, зачем нужна подстановка и какую именно цену она убирает. Заодно проверяют знание noinline и crossinline.
Как отвечать
inline говорит компилятору подставить тело функции в место вызова вместо обычного вызова. Смысл не в экономии на вызове, а в лямбдах: обычная функция с лямбдой создаёт объект Function, а при подстановке тело лямбды оказывается прямо в вызывающем коде, и объекта нет вовсе.
inline fun measure(block: () -> Unit) {
val start = System.nanoTime()
block()
println(System.nanoTime() - start)
}Отсюда два следствия, которых иначе не получить:
- нелокальный возврат:
returnвнутри лямбды выходит из внешней функции, потому что лямбда физически там же; - реифицированные обобщения:
inline fun <reified T> ...позволяет узнать тип во время выполнения, хотя обычно обобщения стираются.
Модификаторы: noinline для параметра, который нужно сохранить или передать дальше как объект; crossinline запрещает нелокальный возврат, если лямбда вызывается из другого контекста.
Когда не надо: у большой функции подстановка раздувает байт-код в каждом месте вызова. Смысл есть у коротких функций высшего порядка, ровно такие в стандартной библиотеке (let, apply, forEach).
Где спотыкаются
Ставят inline на функции без лямбд, где выигрыша нет, а размер растёт. Компилятор на это и предупреждает.
Не знают про reified и пишут передачу Class<T> параметром.
Не могут объяснить, почему нелокальный возврат работает только в подставляемой лямбде.
Забывают, что подставленная функция не видит приватные члены вызывающего кода, и получают ошибку компиляции.