Выбор ответа Middle Dart: классы и миксины обновлено

Dart: переопределение == без hashCode

Вопрос

Класс переопределяет == по полю id, но не переопределяет hashCode. Что сломается?

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

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

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

Коротко

Правильный ответ: Хеш-коллекции сочтут равные объекты разными: set.contains(User(1)) даст false. Хеш-коллекции сначала ищут корзину по hashCode, а потом сравнивают ==.

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

  1. Ничего: hashCode автоматически вычисляется из переопределённого оператора ==
  2. Хеш-коллекции сочтут равные объекты разными: set.contains(User(1)) даст falseправильный ответ
  3. Код не скомпилируется: Dart требует переопределять == и hashCode только парой
  4. Сломается только print объекта, потому что toString использует hashCode

Разбор

Хеш-коллекции сначала ищут корзину по hashCode, а потом сравнивают ==. У двух равных по id объектов хеши по умолчанию разные (по идентичности), и поиск не найдёт элемент. Компилятор не требует пару (это делает линтер hash_and_equals). Обычно используют Object.hash(...), equatable или freezed.

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

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

Термины по теме