比較
以下特徵可用於比較不同的值。如果欄位會實作這些特徵,您可以針對含有這類欄位的型別衍生所有特徵。
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 10 minutes.
PartialEq
可以在不同的型別之間實作,但具有自反性的 Eq
無法:
struct Key { id: u32, metadata: Option<String>, } impl PartialEq<u32> for Key { fn eq(&self, other: &u32) -> bool { self.id == *other } }
實務上一般會衍生這些特徵,但鮮少會實作這些特徵。