Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Порівняння

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

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
    }
}

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