Порівняння

Ці трейти підтримують порівняння між значеннями. Усі трейти можуть бути визначені для типів, що містять поля, які реалізують ці трейти

PartialEq та Eq

PartialEq- це відношення часткової еквівалентності, з обов'язковим методомeqта наданим методомne. Оператори ==та!=` викликають ці методи.

struct Key {
    id: u32,
    metadata: Option<String>,
}
impl PartialEq for Key {
    fn eq(&self, other: &Self) -> bool {
        self.id == other.id
    }
}

Eq - це відношення повної еквівалентності (рефлексивне, симетричне та транзитивне) і передбачає PartialEq. Функції, які вимагають повної еквівалентності, використовуватимуть Eq як обмеження трейту.

PartialOrd та Ord

PartialOrd визначає часткове впорядкування за допомогою методу partial_cmp. Він використовується для реалізації операторів <, <=, >= та >.

use std::cmp::Ordering;
#[derive(Eq, PartialEq)]
struct Citation {
    author: String,
    year: u32,
}
impl PartialOrd for Citation {
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
        match self.author.partial_cmp(&other.author) {
            Some(Ordering::Equal) => self.year.partial_cmp(&other.year),
            author_ord => author_ord,
        }
    }
}

Ord - це повне впорядкування, з cmp який повертає Ordering.

This slide should take about 5 minutes.

PartialEq може бути реалізовано між різними типами, але Eq не може, тому що є рефлексивним:

struct Key {
    id: u32,
    metadata: Option<String>,
}
impl PartialEq<u32> for Key {
    fn eq(&self, other: &u32) -> bool {
        self.id == *other
    }
}

На практиці ці трейти часто виводяться, але рідко реалізуються.