他の言語との比較

これらのトレイトは値の比較をサポートします。すべてのトレイトは、これらのトレイトを実装するフィールドを含む型用に導出できます。

PartialEqEq

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 を使用します。

PartialOrdOrd

PartialOrdpartial_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 は全順序を示し、cmpOrdering を返します。

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
    }
}

実際には、これらのトレイトを導出することは一般的ですが、実装するのは一般的ではありません。