Comparaciones

Estos traits permiten comparar valores. Se pueden derivar todos los traits de los tipos que contengan campos que implementen estos traits.

PartialEq y Eq

PartialEq es una relación de equivalencia parcial, con el método requerido eq y el método proporcionado ne. Los operadores == y != llamarán a estos métodos.

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

Eq es una relación de equivalencia completa (reflexiva, simétrica y transitiva) e implica PartialEq. Las funciones que requieren una equivalencia total usan Eq como límite del trait.

PartialOrd and Ord

PartialOrd define un orden parcial, con un método partial_cmp. Se usa para implementar los operadores <, <=, >= y >.

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 es un orden total en el que cmp devuelve Ordering.

This slide should take about 10 minutes.

PartialEq se puede implementar entre diferentes tipos, pero Eq no, ya que es reflexivo:

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

En la práctica, es habitual derivar estos traits, aunque no se suelen implementar.