Выбор ответа Middle Типы значений и ссылочные обновлено

Зачем indirect у enum

Вопрос

Почему без indirect не компилируется enum Node { case leaf(Int); case pair(Node, Node) }?

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

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

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

Коротко

Правильный ответ: Рекурсивное значение имело бы бесконечный размер; indirect даёт бокс. Размер типа значения известен при компиляции.

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

  1. Enum не может иметь связанных значений разных типов в разных кейсах
  2. Рекурсивное значение имело бы бесконечный размер; indirect даёт боксправильный ответ
  3. indirect делает enum ссылочным типом с идентичностью, как класс
  4. Нужно явно указать raw value типа Int, иначе рекурсия запрещена

Разбор

Размер типа значения известен при компиляции. Если Node содержит Node напрямую, размер бесконечен. indirect упаковывает связанное значение в бокс в куче, а снаружи enum остаётся типом значения без идентичности. Raw values и связанные значения разных типов здесь ни при чём.

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

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