Выбор ответа Senior Лямбды, inline и reified обновлено

Зачем нужен crossinline

Вопрос

Почему этот код не компилируется без crossinline у параметра block?

inline fun runOnUi(block: () -> Unit) {
    handler.post { block() }
}

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

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

Варианты ответа

  1. Inline-функции не могут вызывать методы Handler напрямую
  2. block нельзя вызывать больше одного раза без crossinline
  3. post требует suspend-лямбду, а block обычная
  4. block вызван во вложенной лямбде, где non-local return невозможенправильный ответ

Разбор

Лямбда inline-функции по умолчанию может содержать return из внешней функции. Но здесь block вызывается внутри другой лямбды, которая выполнится позже и на другом стеке, выйти оттуда из вызывающей функции нельзя. crossinline запрещает non-local return в переданной лямбде и тем самым разрешает такой вызов. С Handler и числом вызовов проблем нет, post принимает обычный Runnable.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.