Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗dtOpVlEq 69 of 113 menu
◀ ▶

Сравнение и 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). Выведите на экран размер полученного множества.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить