比較

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

PartialEqEq

PartialEq は部分同値関係であり、必須メソッド eq と、デフォルト実装されたメソッド ne を持ちます。== 演算子と != 演算子はこれらのメソッドを呼び出します。

// 著作権 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

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

PartialOrd は、partial_cmp メソッドを持つ半順序を定義します。これは <<=>=> 演算子を実装するために使われます。

// 著作権 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

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 を返す全順序です。

  • PartialEq は異なる型の間でも実装できますが、Eq は反射的であるためできません:

    // 著作権 2023 Google LLC
    // SPDX-License-Identifier: Apache-2.0
    
    struct Key {
        id: u32,
        metadata: Option<String>,
    }
    impl PartialEq<u32> for Key {
        fn eq(&self, other: &u32) -> bool {
            self.id == *other
        }
    }
  • 実際には、これらのトレイトは導出するのが一般的ですが、実装することはあまりありません。

  • Rust で参照を比較するときは、参照そのものではなく、参照先の値が比較されます。つまり、参照先の値が同じであれば、異なる 2 つのものへの参照でも等しいと比較されることがあります:

    // 著作権 2023 Google LLC
    // SPDX-License-Identifier: Apache-2.0
    
    fn main() {
        let a = "Hello";
        let b = String::from("Hello");
        assert_eq!(a, b);
    }