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