Сравнение и hashCode в Dart
У обычного класса оператор == без переопределения
сравнивает ссылки.
Для класса-значения оператор == пишут вручную:
два экземпляра с одинаковыми полями считаются равными,
даже если созданы отдельными вызовами конструктора:
class Post {
final String title;
final int likes;
const Post(this.title, this.likes);
@override
bool operator ==(Object other) {
return other is Post &&
other.title == title &&
other.likes == likes;
}
@override
int get hashCode => Object.hash(title, likes);
}
Создадим объекты и выведем результат:
var a = Post("Ann", 25);
var b = Post("Ann", 25);
print(a == b);
print(identical(a, b));
Если хотя бы одно поле отличается, результат
== будет false. Оператор
!= дает противоположный ответ:
class Point {
final int x;
final int y;
Point(this.x, this.y);
@override
bool operator ==(Object other) {
return other is Point &&
other.x == x &&
other.y == y;
}
@override
int get hashCode => Object.hash(x, y);
}
Создадим объекты и выведем результат:
var p1 = Point(1, 2);
var p2 = Point(1, 3);
print(p1 != p2);
Рядом с operator == переопределяют
hashCode по тем же полям. Это важно,
когда объекты кладут в Set или в ключи
Map - дубликаты по содержимому
не размножаются:
class Tag {
final String code;
Tag(this.code);
@override
bool operator ==(Object other) {
return other is Tag && other.code == code;
}
@override
int get hashCode => code.hashCode;
}
Поместим объекты в множество:
var set = {Tag("go"), Tag("go")};
print(set.length);
Сделайте класс Item с полями
sku и qty.
Даны два объекта:
var left = Item("A1", 3);
var right = Item("A1", 3);
Выведите на экран true, если объекты
равны по ==, иначе false.
Сделайте класс PairNum с полями
a и b.
Создайте множество из трех элементов:
PairNum(1, 2), PairNum(1, 2),
PairNum(2, 1).
Выведите на экран размер полученного множества.