Выбор ответа Senior Лямбды, inline и reified обновлено
Зачем нужен crossinline
Вопрос
Почему этот код не компилируется без crossinline у параметра block?
inline fun runOnUi(block: () -> Unit) {
handler.post { block() }
}
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: block вызван во вложенной лямбде, где non-local return невозможен. Лямбда inline-функции по умолчанию может содержать return из внешней функции.
Варианты ответа
- Inline-функции не могут вызывать методы
Handlerнапрямую blockнельзя вызывать больше одного раза безcrossinlinepostтребуетsuspend-лямбду, аblockобычнаяblockвызван во вложенной лямбде, где non-local return невозможенправильный ответ
Разбор
Лямбда inline-функции по умолчанию может содержать return из внешней функции. Но здесь block вызывается внутри другой лямбды, которая выполнится позже и на другом стеке, выйти оттуда из вызывающей функции нельзя. crossinline запрещает non-local return в переданной лямбде и тем самым разрешает такой вызов. С Handler и числом вызовов проблем нет, post принимает обычный Runnable.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.