Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Двойное равно (==) в Dart: Сравнение значений
Двойное равно == в Dart — это оператор сравнения по значению, который проверяет, равны ли значения двух объектов. Это отличается от оператора идентичности identical() и одиночного равно = (присваивание).
Три типа операторов равенства
1. = (присваивание):
int x = 5; // Присваиваем значение 5 переменной x
String name = 'Alice'; // Присваиваем строку
2. == (сравнение по значению):
int a = 5;
int b = 5;
print(a == b); // true — значения одинаковые
String name1 = 'Alice';
String name2 = 'Alice';
print(name1 == name2); // true — строки содержат один текст
3. identical() (проверка идентичности):
int a = 5;
int b = 5;
print(identical(a, b)); // true для чисел (кэширование)
List list1 = [1, 2, 3];
List list2 = [1, 2, 3];
print(list1 == list2); // true — содержимое одинаковое
print(identical(list1, list2)); // false — разные объекты в памяти
Как работает == с примитивными типами
Числа:
print(5 == 5); // true
print(5 == 5.0); // true — разные типы, но равные значения
print(5 == 6); // false
int a = 5;
int b = 5;
print(a == b); // true
Строки:
String str1 = 'Hello';
String str2 = 'Hello';
print(str1 == str2); // true — содержимое одинаковое
String str3 = 'hello';
print(str1 == str3); // false — разный регистр (case sensitive)
Булевы:
print(true == true); // true
print(true == false); // false
bool a = true;
bool b = true;
print(a == b); // true
Сравнение коллекций
Списки:
List<int> list1 = [1, 2, 3];
List<int> list2 = [1, 2, 3];
List<int> list3 = [1, 2, 4];
print(list1 == list2); // true — все элементы одинаковые
print(list1 == list3); // false — последний элемент отличается
print(list1 == list1); // true
Карты:
Map<String, int> map1 = {'a': 1, 'b': 2};
Map<String, int> map2 = {'a': 1, 'b': 2};
Map<String, int> map3 = {'a': 1};
print(map1 == map2); // true
print(map1 == map3); // false
print(map2 == map1); // true (порядок не важен)
Sets:
Set<int> set1 = {1, 2, 3};
Set<int> set2 = {3, 2, 1};
Set<int> set3 = {1, 2};
print(set1 == set2); // true — порядок не важен
print(set1 == set3); // false
Сравнение пользовательских объектов
Проблема по умолчанию:
class User {
final String name;
final int age;
User(this.name, this.age);
}
User user1 = User('Alice', 30);
User user2 = User('Alice', 30);
print(user1 == user2); // false! — разные объекты в памяти
print(identical(user1, user2)); // false
Решение: переопределить == и hashCode:
class User {
final String name;
final int age;
User(this.name, this.age);
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is User &&
other.name == name &&
other.age == age;
}
@override
int get hashCode => name.hashCode ^ age.hashCode;
}
User user1 = User('Alice', 30);
User user2 = User('Alice', 30);
print(user1 == user2); // true! — теперь работает
Использование equatable пакета
Удобный способ:
import 'package:equatable/equatable.dart';
class User extends Equatable {
final String name;
final int age;
const User(this.name, this.age);
@override
List<Object> get props => [name, age]; // Поля для сравнения
}
User user1 = User('Alice', 30);
User user2 = User('Alice', 30);
print(user1 == user2); // true — equatable сделал это за нас
Null-aware сравнение
Работа с null:
int? a = null;
int? b = null;
int? c = 5;
print(a == b); // true — оба null
print(a == c); // false — null не равен 5
print(c == null); // false
Безопасное сравнение:
String? name1 = null;
String? name2 = 'Alice';
if (name1 == null) {
print('Имя не заполнено');
}
if (name2 != null) {
print('Имя: $name2');
}
Сравнение в условных операторах
If условия:
int status = 200;
if (status == 200) {
print('Успешный запрос');
} else if (status == 404) {
print('Не найдено');
} else if (status == 500) {
print('Ошибка сервера');
}
Switch выражение:
enum RequestStatus { success, notFound, error }
RequestStatus status = RequestStatus.success;
String message = switch(status) {
RequestStatus.success => 'Успешно',
RequestStatus.notFound => 'Не найдено',
RequestStatus.error => 'Ошибка',
};
Лучшие практики
1. Используйте == для значений:
// Правильно
if (user.age == 18) { }
if (list.length == 0) { }
// Неправильно
if (user.age = 18) { } // Присваивание!
2. Переопределяйте == в кастомных классах:
// ВСЕГДА делайте это для моделей данных
class Product {
final int id;
final String name;
// Используйте equatable или вручную реализуйте
@override
bool operator ==(Object other) => /* реализация */;
@override
int get hashCode => id.hashCode ^ name.hashCode;
}
3. Помните о производительности:
// Сравнение больших объектов может быть дорогим
// Кэшируйте результаты, если используете часто
4. Не забывайте о null безопасности:
// Проверяйте на null перед сравнением
if (value != null && value == targetValue) { }
Понимание разницы между =, == и identical() — это основа правильной работы с данными в Dart.