比較
以下特徵可用於比較不同的值。如果欄位會實作這些特徵,您可以針對含有這類欄位的型別衍生所有特徵。
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
}
}
實務上一般會衍生這些特徵,但鮮少會實作這些特徵。