PartialEq と Eq

これらは同値関係を定義付けします。

PartialEq<Rhs>は、演算子==::eq)と!=::ne)を実装してます。数値(i32)などで==によって同じ値か確認できるのはこのトレイトをi32が持っているからです。

assert!(33_i32 == 33_i32);

このトレイトは以下が成立することを保証します。

  • 対称関係: a == b, b == a
  • 推移関係: a == b, b == c, a == c

Eqは、上記に加えて、

  • 反射関係: a == a

を保証します。

EqPartialEqをスーパートレイトとして持ちますが、中身は空で単にその要素が反射関係を満たすかどうかを定義付ける意味で対象に持たせます。

これらはderiveにより簡単に持たせることができますが、Eqを持たせるには必ずPartialEqも持っている必要があります。

例えばPartialEqは有るが、Eqは無いものの1つにf32があります。これはf32にはstd::f32::NANが含まれますが、これは同じ物同士の比較でもtrueになりません。

let nan: f32 = std::f32::NAN;
assert!(nan == nan); // panic!