Трейт Eq
Трейт Eq - это маркерный трейт, который указывает,
что равенство для типа является рефлексивным,
симметричным и транзитивным. Он расширяет трейт
PartialEq и не добавляет новых методов,
а лишь гарантирует, что сравнение на равенство
ведёт себя как настоящее математическое равенство.
Тип может реализовать Eq только в том случае,
если для него уже реализован PartialEq.
Параметров у этого трейта нет, так как он не содержит методов.
Синтаксис
trait Eq: PartialEq { }
Для реализации трейта Eq используется
ключевое слово impl.
impl Eq for MyType { }
Пример
Давайте создадим структуру и реализуем для неё
трейты PartialEq и Eq:
#[derive(Debug)]
struct Point
{
x: i32,
y: i32,
}
impl PartialEq for Point
{
fn eq(&self, other: &Self) -> bool
{
self.x == other.x && self.y == other.y
}
}
impl Eq for Point { }
fn main()
{
let p1 = Point { x: 1, y: 2 };
let p2 = Point { x: 1, y: 2 };
let p3 = Point { x: 3, y: 4 };
println!("{}", p1 == p2);
println!("{}", p1 == p3);
}
Результат выполнения кода:
true
false
Пример
Давайте используем трейт Eq для хранения
значений в HashMap, где ключ должен
поддерживать полное равенство:
use std::collections::HashMap;
#[derive(Debug, PartialEq, Eq, Hash)]
struct Key
{
id: i32,
}
fn main()
{
let mut map = HashMap::new();
map.insert(Key { id: 1 }, "abcde");
map.insert(Key { id: 2 }, "12345");
let res = map.get(&Key { id: 1 });
println!("{:?}", res);
}
Результат выполнения кода:
Some("abcde")
Пример
Давайте проверим, что тип с плавающей точкой
не реализует трейт Eq, так как значения
NaN не равны сами себе:
fn is_eq<T: Eq>() -> &'static str
{
"implements Eq"
}
fn main()
{
let res = is_eq::<i32>();
println!("{}", res);
}
Результат выполнения кода:
"implements Eq"
Если же попытаться вызвать эту функцию для f64,
компилятор выдаст ошибку, потому что f64
реализует только PartialEq, но не Eq.
Смотрите также
-
трейт
PartialEq,
который обеспечивает частичное равенство значений -
трейт
Hash,
который позволяет использовать тип в качестве ключа хеш-таблицы -
трейт
Ord,
который задаёт полный порядок для типа -
трейт
PartialOrd,
который обеспечивает частичное сравнение значений