0Pricing
Dart Academy · Урок

copyWith и равенство по значению

Обновляйте неизменяемые данные и сравнивайте их по значению

«copyWith и равенство по значению» — бесплатный урок Dart Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Dart Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Dart Academy содержит 4 уроков всего.

Обновление неизменяемых данных

Изменить неизменяемый объект нельзя, поэтому для его обновления создают новый объект. Шаблон, который делает это аккуратно, называется copyWith.

Что делает copyWith

Метод copyWith возвращает новый объект: сохраняет текущие значения пропущенных полей и заменяет только переданные поля.

final updated = user.copyWith(name: 'Ada');

Написание copyWith

Каждый параметр допускает значение null и по умолчанию получает значение существующего поля. Это позволяет вызывающему коду переопределять только нужные ему поля.

User copyWith({String? name}) =>
  User(name: name ?? this.name);

Ловушка null

Приём ?? this.field означает, что с помощью copyWith нельзя присвоить полю значение null. Большинство моделей данных принимает это небольшое ограничение.

Равенство по умолчанию

По умолчанию два объекта равны только тогда, когда это один и тот же экземпляр. Две копии с одинаковыми данными всё равно считаются разными.

User('Ada') == User('Ada'); // false

Цель равенства по значению

Часто нужно, чтобы объекты считались равными при совпадении их данных, а не идентичности. Это называется равенством по значению; его нужно включить отдельно.

Переопределение оператора ==

Определите оператор ==, чтобы сравнивать важные поля. Теперь два объекта с одинаковыми данными будут считаться равными.

bool operator ==(o) =>
  o is User && o.name == name;

Всегда переопределяйте hashCode

При переопределении == необходимо также переопределить hashCode. Равные объекты должны иметь одинаковый хеш, иначе множества и отображения будут работать неправильно.

int get hashCode => name.hashCode;

Вспомогательная функция Object.hash

Удобно объединяйте несколько полей с помощью Object.hash. Она создаёт один качественный хеш-код из всех переданных значений.

int get hashCode => Object.hash(name, age);

Равенство расширяет возможности коллекций

При равенстве по значению множество может удалять настоящие дубликаты, а отображение — находить ключи по данным, а не по идентичности.

Поручите это инструментам

Пакеты вроде equatable или freezed автоматически создают ==, hashCode и copyWith, поэтому Ваши неизменяемые модели остаются короткими и корректными. 🛠️

Быстрая проверка

Быстрая проверка равенства по значению.

Итоги

Вы научились обновлять неизменяемые данные с помощью copyWith и сравнивать объекты по данным, используя == вместе с hashCode для настоящего равенства по значению. 🌟

Часто задаваемые вопросы

Урок «copyWith и равенство по значению» бесплатный?

Да — полный текст урока «copyWith и равенство по значению» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Dart Academy, подпишись на CoddyKit PRO. Курс Dart Academy содержит 4 уроков всего.

Чему я научусь в уроке «copyWith и равенство по значению»?

Обновляйте неизменяемые данные и сравнивайте их по значению Ты практикуешь Dart Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Dart Academy?

Предыдущий опыт не требуется. Dart Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «copyWith и равенство по значению»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Dart Academy?

Да. Каждый урок Dart Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Поля final и глубокая неизменяемость
  2. Классы sealed и исчерпывающий switch
  3. Модификаторы base, interface и final
  4. copyWith и равенство по значению
← Назад к Dart Academy