Comparações
Esses traits
suportam comparações entre valores. Todos os traits
podem ser derivados para tipos que contêm campos que implementam esses traits
.
PartialEq
e Eq
PartialEq
é uma relação de equivalência parcial, com o método eq
obrigatório e o método ne
fornecido. Os operadores ==
e !=
chamarão esses métodos.
struct Key { id: u32, metadata: Option<String>, } impl PartialEq for Key { fn eq(&self, other: &Self) -> bool { self.id == other.id } }
Eq
é uma relação de equivalência completa (reflexiva, simétrica e transitiva) e implica PartialEq
. Funções que exigem equivalência completa usarão Eq
como um limite de trait
.
PartialOrd
e Ord
PartialOrd
define uma ordenação parcial, com um método partial_cmp
. Ele é usado para implementar os operadores <
, <=
, >=
e >
.
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
é uma ordenação total, com cmp
retornando Ordering
.
PartialEq
pode ser implementado entre diferentes tipos, mas Eq
não pode, porque é reflexivo:
struct Key { id: u32, metadata: Option<String>, } impl PartialEq<u32> for Key { fn eq(&self, other: &u32) -> bool { self.id == *other } }
Na prática, é comum derivar esses traits
, mas incomum implementá-los.