Skip to main content

Discriminant

Struct Discriminant 

1.21.0 · Source
pub struct Discriminant<T>(/* private fields */);
Expand description

Opaque type representing the discriminant of an enum.

See the discriminant function in this module for more information.

Implementations§

Source§

impl<T> Discriminant<T>

Source

pub const fn ord(&self) -> DiscriminantOrd<T>

🔬This is a nightly-only experimental API. (discriminant_ord)

Returns an ordering key for this Discriminant that has an unstable implementation with regards to semantic versioning. This is not the be confused with an [“unstable sort”].

Because all types have a publicly accessible Discriminant, regardless of whether the order of said type is a part of its stability guarantees, the exact ordering of the returned DiscriminantOrd cannot be relied on for stability across crates. This is similar to the stability of the size of a type as returned by size_of.

Enum values will be ordered based on the source declaration and repr values of their variants, consistent with derived implementations of PartialOrd and Ord. Noting that only the discriminant and no field values are considered. All other kinds of values have an unspecified ordering, but will typically be trivially ordered as equivalent.

Users of this function should instead rely on the Ord implementation of T wherever possible.

§Examples
#![feature(discriminant_ord)]

use std::cmp::Ordering;
use std::mem::discriminant;

enum Foo { A(i32), B(i32) }

// Equivalent arms will compare equal regardless of contained data
assert_matches!(
    discriminant(&Foo::A(1)).ord().cmp(&discriminant(&Foo::A(2)).ord()),
    Ordering::Equal,
);

// Inequivalent arms will compare not-equal
assert_matches!(
    discriminant(&Foo::A(1)).ord().cmp(&discriminant(&Foo::B(1)).ord()),
    Ordering::Less | Ordering::Greater,
);

Upstream libraries and the compiler are free to change the exact ordering of discriminants. The below may break at any time:

ⓘ
// Foo::A is declared before Foo::B, but that ordering is not stable
assert_matches!(
    discriminant(&Foo::A(0)).ord().cmp(&discriminant(&Foo::B(0)).ord()),
    Ordering::Less,
);

Trait Implementations§

1.21.0 · Source§

impl<T> Clone for Discriminant<T>

Source§

fn clone(&self) -> Discriminant<T>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
1.21.0 · Source§

impl<T> Copy for Discriminant<T>

1.21.0 · Source§

impl<T> Debug for Discriminant<T>

Source§

fn fmt(&self, fmt: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
1.21.0 · Source§

impl<T> Eq for Discriminant<T>

1.21.0 · Source§

impl<T> Hash for Discriminant<T>

Source§

fn hash<H>(&self, state: &mut H)
where H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
1.21.0 · Source§

impl<T> PartialEq for Discriminant<T>

Source§

fn eq(&self, rhs: &Discriminant<T>) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> AnySend for T
where T: Any + Send,

Source§

impl<T> AnySendClone for T
where T: Any + Send + Clone,

Source§

impl<T> AnySendSync for T
where T: Any + Send + Sync,

Source§

impl<T> AnySendSyncClone for T
where T: Any + Send + Sync + Clone,

Source§

impl<T> AnySync for T
where T: Any + Sync,

Source§

impl<T> AnySyncClone for T
where T: Any + Sync + Clone,

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.