これらは同値関係を定義付けします。
PartialEq<Rhs>
は、演算子==
(::eq
)と!=
(::ne
)を実装してます。数値(i32
)などで==
によって同じ値か確認できるのはこのトレイトをi32
が持っているからです。
assert!(33_i32 == 33_i32);
このトレイトは以下が成立することを保証します。
対称関係:
a == b
,b == a
推移関係:
a == b
,b == c
,a == c
Eq
は、上記に加えて、
反射関係:
a == a
を保証します。
Eq
はPartialEq
をスーパートレイトとして持ちますが、中身は空で単にその要素が反射関係を満たすかどうかを定義付ける意味で対象に持たせます。
これらはderive
により簡単に持たせることができますが、Eq
を持たせるには必ずPartialEq
も持っている必要があります。
例えばPartialEq
は有るが、Eq
は無いものの1つにf32
があります。これはf32
にはstd::f32::NAN
が含まれますが、これは同じ物同士の比較でもtrue
になりません。
let nan: f32 = std::f32::NAN;
assert!(nan == nan); // panic!