他の言語との比較
これらのトレイトは値の比較をサポートします。すべてのトレイトは、これらのトレイトを実装するフィールドを含む型用に導出できます。
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 } }
実際には、これらのトレイトを導出することは一般的ですが、実装するのは一般的ではありません。