РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
564 of 1245 menu

Трейт 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,
    который обеспечивает частичное сравнение значений
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить