Выбор ответа Middle Dart: классы и миксины обновлено
Dart: переопределение == без hashCode
Вопрос
Класс переопределяет == по полю id, но не переопределяет hashCode. Что сломается?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Хеш-коллекции сочтут равные объекты разными: set.contains(User(1)) даст false. Хеш-коллекции сначала ищут корзину по hashCode, а потом сравнивают ==.
Варианты ответа
- Ничего:
hashCodeавтоматически вычисляется из переопределённого оператора== - Хеш-коллекции сочтут равные объекты разными:
set.contains(User(1))дастfalseправильный ответ - Код не скомпилируется: Dart требует переопределять
==иhashCodeтолько парой - Сломается только
printобъекта, потому чтоtoStringиспользуетhashCode
Разбор
Хеш-коллекции сначала ищут корзину по hashCode, а потом сравнивают ==. У двух равных по id объектов хеши по умолчанию разные (по идентичности), и поиск не найдёт элемент. Компилятор не требует пару (это делает линтер hash_and_equals). Обычно используют Object.hash(...), equatable или freezed.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Dart 3: модификатор interface
Следующий вопрос
Dart: расширения разрешаются статически