Trait Eq
pub 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 == a - transitive:
a == bandb == cimpliesa == c - consistent:
a != bif and only if!(a == b)
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:
Provided Methods
fn assert_receiver_is_total_eq(&self)fn assert_fields_are_eq(&self)
Implementors
impl Eq for ()impl Eq for AddrKindimpl Eq for AddrParseErrorimpl Eq for Alignmentimpl Eq for Alignmentimpl Eq for AlignmentEnumimpl Eq for AllocErrorimpl Eq for AsciiCharimpl Eq for Assumeimpl Eq for AtomicOrderingimpl Eq for BiasedFpimpl Eq for Big32x40impl Eq for Big8x3impl Eq for ByteStrimpl Eq for CStrimpl Eq for CharCaseimpl Eq for CharErrorKindimpl Eq for CharTryFromErrorimpl Eq for CodePointimpl Eq for CodePointInnerimpl Eq for CpuidResultimpl Eq for DebugAsHeximpl Eq for Decimalimpl Eq for DecodeUtf16Errorimpl Eq for Decodedimpl Eq for Durationimpl Eq for Errorimpl Eq for ErrorKindimpl Eq for FieldIdimpl Eq for FloatErrorKindimpl Eq for FormattingOptionsimpl Eq for FpCategoryimpl Eq for FromBytesUntilNulErrorimpl Eq for FromBytesWithNulErrorimpl Eq for FullDecodedimpl Eq for GetDisjointMutErrorimpl Eq for I32NotAllOnesimpl Eq for I64NotAllOnesimpl Eq for IndexRangeimpl Eq for IntErrorKindimpl Eq for IpAddrimpl Eq for Ipv4Addrimpl Eq for Ipv6Addrimpl Eq for Ipv6MulticastScopeimpl Eq for Layoutimpl Eq for LayoutErrorimpl Eq for Localityimpl Eq for Location<'_>impl Eq for Nanosecondsimpl Eq for NonZeroCharInnerimpl Eq for NonZeroI128Innerimpl Eq for NonZeroI16Innerimpl Eq for NonZeroI32Innerimpl Eq for NonZeroI64Innerimpl Eq for NonZeroI8Innerimpl Eq for NonZeroIsizeInnerimpl Eq for NonZeroU128Innerimpl Eq for NonZeroU16Innerimpl Eq for NonZeroU32Innerimpl Eq for NonZeroU64Innerimpl Eq for NonZeroU8Innerimpl Eq for NonZeroUsizeInnerimpl Eq for Orderingimpl Eq for Orderingimpl Eq for ParseBoolErrorimpl Eq for ParseCharErrorimpl Eq for ParseFloatErrorimpl Eq for ParseIntErrorimpl Eq for PhantomPinnedimpl Eq for RangeFullimpl Eq for SearchStepimpl Eq for SeekFromimpl Eq for Signimpl Eq for Signimpl Eq for SimdAlignimpl Eq for SocketAddrimpl Eq for SocketAddrV4impl Eq for SocketAddrV6impl Eq for TryFromCharErrorimpl Eq for TryFromFloatSecsErrorimpl Eq for TryFromFloatSecsErrorKindimpl Eq for TryFromIntErrorimpl Eq for TypeIdimpl Eq for U32NotAllOnesimpl Eq for U64NotAllOnesimpl Eq for UsizeNoHighBitimpl Eq for Utf8Errorimpl Eq for VariantIdimpl Eq for Wtf8impl Eq for boolimpl Eq for charimpl Eq for i128impl Eq for i16impl Eq for i32impl Eq for i64impl Eq for i8impl Eq for isizeimpl Eq for neverimpl Eq for strimpl Eq for svpatternimpl Eq for svprfopimpl Eq for u128impl Eq for u16impl Eq for u32impl Eq for u64impl Eq for u8impl Eq for usizeimpl<'a> Eq for Part<'a>impl<'a> Eq for PhantomContravariantLifetime<'a>impl<'a> Eq for PhantomCovariantLifetime<'a>impl<'a> Eq for PhantomInvariantLifetime<'a>impl<'a> Eq for Utf8Chunk<'a>impl<'a> Eq for Utf8Pattern<'a>impl<A> Eq for &A where A: ~const Eq + PointeeSized,impl<A> Eq for &mut A where A: ~const Eq + PointeeSized,impl<A: ~const Eq, Z: ~const Eq, Y: ~const Eq, X: ~const Eq, W: ~const Eq, V: ~const Eq, U: ~const Eq, T: ~const Eq> Eq for (A, Z, Y, X, W, V, U, T)impl<B: ~const Eq, A: ~const Eq, Z: ~const Eq, Y: ~const Eq, X: ~const Eq, W: ~const Eq, V: ~const Eq, U: ~const Eq, T: ~const Eq> Eq for (B, A, Z, Y, X, W, V, U, T)impl<B: ~const Eq, C: ~const Eq> Eq for ControlFlow<B, C>impl<C: ~const Eq, B: ~const Eq, A: ~const Eq, Z: ~const Eq, Y: ~const Eq, X: ~const Eq, W: ~const Eq, V: ~const Eq, U: ~const Eq, T: ~const Eq> Eq for (C, B, A, Z, Y, X, W, V, U, T)impl<D: ~const Eq, C: ~const Eq, B: ~const Eq, A: ~const Eq, Z: ~const Eq, Y: ~const Eq, X: ~const Eq, W: ~const Eq, V: ~const Eq, U: ~const Eq, T: ~const Eq> Eq for (D, C, B, A, Z, Y, X, W, V, U, T)impl<Dyn: PointeeSized> Eq for DynMetadata<Dyn>impl<E: ~const Eq, D: ~const Eq, C: ~const Eq, B: ~const Eq, A: ~const Eq, Z: ~const Eq, Y: ~const Eq, X: ~const Eq, W: ~const Eq, V: ~const Eq, U: ~const Eq, T: ~const Eq> Eq for (E, D, C, B, A, Z, Y, X, W, V, U, T)impl<F> Eq for fn(T) -> Ret where F: FnPtr,impl<F: FnPtr> Eq for Fimpl<H> Eq for BuildHasherDefault<H>impl<Idx: Eq> Eq for Range<Idx>impl<Idx: Eq> Eq for RangeFrom<Idx>impl<Idx: Eq> Eq for RangeInclusive<Idx>impl<Idx: Eq> Eq for RangeTo<Idx>impl<Idx: Eq> Eq for RangeToInclusive<Idx>impl<Idx: Eq> Eq for RangeToInclusive<Idx>impl<Idx: ~const Eq> Eq for Range<Idx>impl<Idx: ~const Eq> Eq for RangeFrom<Idx>impl<Idx: ~const Eq> Eq for RangeInclusive<Idx>impl<K: Eq, V> Eq for KeyAndValue<K, V>impl<Ptr: Deref<Target: Eq>> Eq for Pin<Ptr>impl<T> Eq for Discriminant<T>impl<T> Eq for NonZero<T> where T: ZeroablePrimitive + ~const Eq,impl<T> Eq for PhantomContravariant<T> where T: ?Sized,impl<T> Eq for PhantomCovariant<T> where T: ?Sized,impl<T> Eq for PhantomInvariant<T> where T: ?Sized,impl<T> Eq for SyncView<T> where T: Sync + ~const Eq + ?Sized,impl<T, const N: usize> Eq for Simd<T, N> where T: SimdElement + Eq,impl<T: ?Sized + Eq> Eq for ManuallyDrop<T>impl<T: ?Sized + Eq> Eq for RefCell<T>impl<T: ?Sized, const VARIANT: u32, const FIELD: u32> Eq for FieldRepresentingType<T, VARIANT, FIELD>impl<T: Eq + Copy> Eq for Cell<T>impl<T: Eq + PointeeSized> Eq for TraitImpl<T>impl<T: Eq> Eq for Complex<T>impl<T: Eq> Eq for Cursor<T>impl<T: Eq> Eq for OnceCell<T>impl<T: Eq> Eq for Poll<T>impl<T: Eq> Eq for Saturating<T>impl<T: Eq> Eq for Wrapping<T>impl<T: PointeeSized> Eq for *const Timpl<T: PointeeSized> Eq for *mut Timpl<T: PointeeSized> Eq for NonNull<T>impl<T: PointeeSized> Eq for PhantomData<T>impl<T: ~const Eq> Eq for (T,)impl<T: ~const Eq> Eq for Bound<T>impl<T: ~const Eq> Eq for Option<T>impl<T: ~const Eq> Eq for Reverse<T>impl<T: ~const Eq> Eq for [T]impl<T: ~const Eq, E: ~const Eq> Eq for Result<T, E>impl<T: ~const Eq, const N: usize> Eq for [T; N]impl<U: ~const Eq, T: ~const Eq> Eq for (U, T)impl<V: ~const Eq, U: ~const Eq, T: ~const Eq> Eq for (V, U, T)impl<W: ~const Eq, V: ~const Eq, U: ~const Eq, T: ~const Eq> Eq for (W, V, U, T)impl<X: ~const Eq, W: ~const Eq, V: ~const Eq, U: ~const Eq, T: ~const Eq> Eq for (X, W, V, U, T)impl<Y: Eq, R: Eq> Eq for CoroutineState<Y, R>impl<Y: ~const Eq, X: ~const Eq, W: ~const Eq, V: ~const Eq, U: ~const Eq, T: ~const Eq> Eq for (Y, X, W, V, U, T)impl<Z: ~const Eq, Y: ~const Eq, X: ~const Eq, W: ~const Eq, V: ~const Eq, U: ~const Eq, T: ~const Eq> Eq for (Z, Y, X, W, V, U, T)