Trait Eq
trait Eq: ~const PartialEq<Self> + PointeeSized
Trait for comparisons corresponding to equivalence relations.
The primary difference to PartialEq is the additional requirement for reflexivity. A type
that implements PartialEq guarantees that for all a, b and c:
- symmetric:
a == bimpliesb == aanda != bimplies!(a == b) - transitive:
a == bandb == cimpliesa == c
Eq, which builds on top of PartialEq also implies:
- reflexive:
a == a
This property cannot be checked by the compiler, and therefore Eq is a trait without methods.
Violating this property is a logic error. The behavior resulting from a logic error is not
specified, but users of the trait must ensure that such logic errors do not result in
undefined behavior. This means that unsafe code must not rely on the correctness of these
methods.
Floating point types such as f32 and f64 implement only PartialEq but not Eq
because NaN != NaN.
Derivable
This trait can be used with #[derive]. When derived, because Eq has no extra methods, it
is only informing the compiler that this is an equivalence relation rather than a partial
equivalence relation. Note that the derive strategy requires all fields are Eq, which isn't
always desired.
How can I implement Eq?
If you cannot use the derive strategy, specify that your type implements Eq, which has no
extra methods:
Implementors
impl Eq for Localityimpl Eq for PhantomPinnedimpl<'a> Eq for Utf8Pattern<'a>impl Eq for i64impl Eq for Orderingimpl Eq for ()impl Eq for Ipv6MulticastScopeimpl<Dyn: PointeeSized> Eq for DynMetadata<Dyn>impl<T: Eq> Eq for OnceCell<T>impl<B: ~const $crate::cmp::Eq, C: ~const $crate::cmp::Eq> Eq for ControlFlow<B, C>impl Eq for SearchStepimpl Eq for i128impl<T> Eq for Exclusive<T>impl Eq for boolimpl<T: ?Sized + Eq> Eq for ManuallyDrop<T>impl Eq for AddrParseErrorimpl<T: Eq + Copy> Eq for Cell<T>impl<F> Eq for fn(_: T) -> Retimpl<Y: $crate::cmp::Eq, R: $crate::cmp::Eq> Eq for CoroutineState<Y, R>impl<'a> Eq for Utf8Chunk<'a>impl Eq for neverimpl Eq for Alignmentimpl<T> Eq for Discriminant<T>impl Eq for charimpl Eq for SocketAddrimpl<T: ?Sized + Eq> Eq for RefCell<T>impl Eq for RangeFullimpl Eq for Durationimpl<A> Eq for &Aimpl Eq for Errorimpl Eq for usizeimpl Eq for SocketAddrV4impl Eq for Alignmentimpl Eq for ParseCharErrorimpl<Idx: $crate::cmp::Eq> Eq for Range<Idx>impl Eq for TryFromFloatSecsErrorimpl<A> Eq for &mut Aimpl Eq for Signimpl Eq for u8impl Eq for SimdAlignimpl Eq for SocketAddrV6impl Eq for CharTryFromErrorimpl Eq for ParseIntErrorimpl<Idx: $crate::cmp::Eq> Eq for RangeFrom<Idx>impl<T: $crate::cmp::Eq> Eq for Poll<T>impl Eq for Infallibleimpl Eq for DebugAsHeximpl Eq for u16impl<T: ~const $crate::cmp::Eq> Eq for Option<T>impl Eq for DecodeUtf16Errorimpl<Idx: $crate::cmp::Eq> Eq for RangeTo<Idx>impl Eq for Layoutimpl<'a> Eq for PhantomCovariantLifetime<'a>impl Eq for FormattingOptionsimpl Eq for u32impl Eq for TryFromIntErrorimpl Eq for Location<'_>impl Eq for TryFromCharErrorimpl<Idx: ~const $crate::cmp::Eq> Eq for RangeInclusive<Idx>impl Eq for LayoutErrorimpl<'a> Eq for PhantomContravariantLifetime<'a>impl<H> Eq for BuildHasherDefault<H>impl Eq for AtomicOrderingimpl Eq for u64impl<Ptr: Deref<Target: Eq>> Eq for Pin<Ptr>impl Eq for CStrimpl<Idx: $crate::cmp::Eq> Eq for RangeToInclusive<Idx>impl Eq for AllocErrorimpl<'a> Eq for PhantomInvariantLifetime<'a>impl<T: ~const Eq> Eq for [T]impl Eq for IntErrorKindimpl Eq for u128impl<Idx: ~const $crate::cmp::Eq> Eq for Range<Idx>impl<T: PointeeSized> Eq for *const Timpl<T: $crate::cmp::Eq> Eq for Saturating<T>impl<T> Eq for NonZero<T>impl Eq for FromBytesWithNulErrorimpl<T: ~const $crate::cmp::Eq> Eq for Bound<T>impl<T: ~const Eq> Eq for (T)impl<T> Eq for PhantomCovariant<T>impl Eq for GetDisjointMutErrorimpl Eq for isizeimpl<Idx: $crate::cmp::Eq> Eq for RangeInclusive<Idx>impl<T: PointeeSized> Eq for *mut Timpl Eq for FromBytesUntilNulErrorimpl Eq for FpCategoryimpl Eq for TypeIdimpl Eq for CpuidResultimpl<T> Eq for PhantomContravariant<T>impl Eq for Utf8Errorimpl Eq for i8impl<Idx: ~const $crate::cmp::Eq> Eq for RangeFrom<Idx>impl Eq for Assumeimpl<F: FnPtr> Eq for Fimpl Eq for IpAddrimpl<T: PointeeSized> Eq for NonNull<T>impl<T: ~const Eq, N: usize> Eq for [T; N]impl<T, N: usize> Eq for Simd<T, N>impl<T> Eq for PhantomInvariant<T>impl Eq for ParseBoolErrorimpl Eq for i16impl<Idx: $crate::cmp::Eq> Eq for RangeToInclusive<Idx>impl Eq for Orderingimpl Eq for Ipv4Addrimpl Eq for AsciiCharimpl<T: PointeeSized> Eq for PhantomData<T>impl Eq for strimpl<T: $crate::cmp::Eq> Eq for Wrapping<T>impl Eq for i32impl<T: ~const $crate::cmp::Eq, E: ~const $crate::cmp::Eq> Eq for Result<T, E>impl<T: ~const $crate::cmp::Eq> Eq for Reverse<T>impl Eq for Ipv6Addrimpl Eq for crate::bstr::ByteStr