比較
これらのトレイトは値同士の比較をサポートします。これらのトレイトを実装するフィールドを含む型では、これらのトレイトをすべて導出できます。
PartialEq と Eq
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 を使用します。
PartialOrd と Ord
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 は、cmp が Ordering を返す全順序です。
-
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); }