pub trait Ord: Eq + PartialOrd<Self> {
fn cmp(&self, other: &Self) -> Ordering;
fn max(self, other: Self) -> Self
where
Self: Sized,
{ ... }
fn min(self, other: Self) -> Self
where
Self: Sized,
{ ... }
fn clamp(self, min: Self, max: Self) -> Self
where
Self: Sized,
{ ... }
}Expand description
Trait for types that form a total order.
Implementations must be consistent with the PartialOrd implementation, and ensure
max, min, and clamp are consistent with cmp:
partial_cmp(a, b) == Some(cmp(a, b)).max(a, b) == max_by(a, b, cmp)(ensured by the default implementation).min(a, b) == min_by(a, b, cmp)(ensured by the default implementation).- For
a.clamp(min, max), see the method docs (ensured by the default implementation).
It’s easy to accidentally make cmp and partial_cmp disagree by
deriving some of the traits and manually implementing others.
Corollaries
From the above and the requirements of PartialOrd, it follows that < defines a strict total order.
This means that for all a, b and c:
- exactly one of
a < b,a == bora > bis true; and <is transitive:a < bandb < cimpliesa < c. The same must hold for both==and>.
Derivable
This trait can be used with #[derive].
When derived on structs, it will produce a
lexicographic ordering
based on the top-to-bottom declaration order of the struct’s members.
When derived on enums, variants are ordered by their discriminants.
By default, the discriminant is smallest for variants at the top, and
largest for variants at the bottom. Here’s an example:
#[derive(PartialEq, Eq, PartialOrd, Ord)]
enum E {
Top,
Bottom,
}
assert!(E::Top < E::Bottom);RunHowever, manually setting the discriminants can override this default behavior:
#[derive(PartialEq, Eq, PartialOrd, Ord)]
enum E {
Top = 2,
Bottom = 1,
}
assert!(E::Bottom < E::Top);RunLexicographical comparison
Lexicographical comparison is an operation with the following properties:
- Two sequences are compared element by element.
- The first mismatching element defines which sequence is lexicographically less or greater than the other.
- If one sequence is a prefix of another, the shorter sequence is lexicographically less than the other.
- If two sequence have equivalent elements and are of the same length, then the sequences are lexicographically equal.
- An empty sequence is lexicographically less than any non-empty sequence.
- Two empty sequences are lexicographically equal.
How can I implement Ord?
Ord requires that the type also be PartialOrd and Eq (which requires PartialEq).
Then you must define an implementation for cmp. You may find it useful to use
cmp on your type’s fields.
Here’s an example where you want to sort people by height only, disregarding id
and name:
use std::cmp::Ordering;
#[derive(Eq)]
struct Person {
id: u32,
name: String,
height: u32,
}
impl Ord for Person {
fn cmp(&self, other: &Self) -> Ordering {
self.height.cmp(&other.height)
}
}
impl PartialOrd for Person {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl PartialEq for Person {
fn eq(&self, other: &Self) -> bool {
self.height == other.height
}
}RunRequired Methods
This method returns an Ordering between self and other.
By convention, self.cmp(&other) returns the ordering matching the expression
self <operator> other if true.
Examples
use std::cmp::Ordering;
assert_eq!(5.cmp(&10), Ordering::Less);
assert_eq!(10.cmp(&5), Ordering::Greater);
assert_eq!(5.cmp(&5), Ordering::Equal);RunProvided Methods
Implementors
impl Ord for Infallible
1.34.0 · sourceimpl Ord for Which
sourceimpl Ord for Ordering
sourceimpl Ord for bool
sourceimpl Ord for char
sourceimpl Ord for i8
sourceimpl Ord for i16
sourceimpl Ord for i32
sourceimpl Ord for i64
sourceimpl Ord for i128
sourceimpl Ord for isize
sourceimpl Ord for !
sourceimpl Ord for str
sourceImplements ordering of strings.
Strings are ordered lexicographically by their byte values. This orders Unicode code
points based on their positions in the code charts. This is not necessarily the same as
“alphabetical” order, which varies by language and locale. Sorting strings according to
culturally-accepted standards requires locale-specific data that is outside the scope of
the str type.
impl Ord for u8
sourceimpl Ord for u16
sourceimpl Ord for u32
sourceimpl Ord for u64
sourceimpl Ord for u128
sourceimpl Ord for ()
sourceimpl Ord for usize
sourceimpl Ord for TypeId
sourceimpl Ord for CpuidResult
1.27.0 · sourceimpl Ord for CStr
sourceimpl Ord for Error
sourceimpl Ord for PhantomPinned
1.33.0 · sourceimpl Ord for NonZeroI8
1.34.0 · sourceimpl Ord for NonZeroI16
1.34.0 · sourceimpl Ord for NonZeroI32
1.34.0 · sourceimpl Ord for NonZeroI64
1.34.0 · sourceimpl Ord for NonZeroI128
1.34.0 · sourceimpl Ord for NonZeroIsize
1.34.0 · sourceimpl Ord for NonZeroU8
1.28.0 · sourceimpl Ord for NonZeroU16
1.28.0 · sourceimpl Ord for NonZeroU32
1.28.0 · sourceimpl Ord for NonZeroU64
1.28.0 · sourceimpl Ord for NonZeroU128
1.28.0 · sourceimpl Ord for NonZeroUsize
1.28.0 · sourceimpl Ord for Duration
1.3.0 · sourceimpl<'a> Ord for Location<'a>
1.10.0 · sourceimpl<A: Ord, B: Ord, C: Ord, D: Ord, E: Ord, F: Ord, G: Ord, H: Ord, I: Ord, J: Ord, K: Ord, L: Ord> Ord for (A, B, C, D, E, F, G, H, I, J, K, L) where
L: ?Sized,
sourceimpl<A: ?Sized> Ord for &A where
A: Ord,
sourceimpl<A: ?Sized> Ord for &mut A where
A: Ord,
sourceimpl<B: Ord, C: Ord, D: Ord, E: Ord, F: Ord, G: Ord, H: Ord, I: Ord, J: Ord, K: Ord, L: Ord> Ord for (B, C, D, E, F, G, H, I, J, K, L) where
L: ?Sized,
sourceimpl<C: Ord, D: Ord, E: Ord, F: Ord, G: Ord, H: Ord, I: Ord, J: Ord, K: Ord, L: Ord> Ord for (C, D, E, F, G, H, I, J, K, L) where
L: ?Sized,
sourceimpl<D: Ord, E: Ord, F: Ord, G: Ord, H: Ord, I: Ord, J: Ord, K: Ord, L: Ord> Ord for (D, E, F, G, H, I, J, K, L) where
L: ?Sized,
sourceimpl<Dyn: ?Sized> Ord for DynMetadata<Dyn>
sourceimpl<E: Ord, F: Ord, G: Ord, H: Ord, I: Ord, J: Ord, K: Ord, L: Ord> Ord for (E, F, G, H, I, J, K, L) where
L: ?Sized,
sourceimpl<F: Ord, G: Ord, H: Ord, I: Ord, J: Ord, K: Ord, L: Ord> Ord for (F, G, H, I, J, K, L) where
L: ?Sized,
sourceimpl<G: Ord, H: Ord, I: Ord, J: Ord, K: Ord, L: Ord> Ord for (G, H, I, J, K, L) where
L: ?Sized,
sourceimpl<H: Ord, I: Ord, J: Ord, K: Ord, L: Ord> Ord for (H, I, J, K, L) where
L: ?Sized,
sourceimpl<I: Ord, J: Ord, K: Ord, L: Ord> Ord for (I, J, K, L) where
L: ?Sized,
sourceimpl<J: Ord, K: Ord, L: Ord> Ord for (J, K, L) where
L: ?Sized,
sourceimpl<K: Ord, L: Ord> Ord for (K, L) where
L: ?Sized,
sourceimpl<L: Ord> Ord for (L,) where
L: ?Sized,
sourceimpl<P: Deref<Target: Ord>> Ord for Pin<P>
1.41.0 · sourceimpl<Ret> Ord for fn() -> Ret
1.4.0 · sourceimpl<Ret> Ord for extern "C" fn() -> Ret
1.4.0 · sourceimpl<Ret> Ord for unsafe fn() -> Ret
1.4.0 · sourceimpl<Ret> Ord for unsafe extern "C" fn() -> Ret
1.4.0 · sourceimpl<Ret, A> Ord for fn(_: A) -> Ret
1.4.0 · sourceimpl<Ret, A> Ord for extern "C" fn(_: A) -> Ret
1.4.0 · sourceimpl<Ret, A> Ord for extern "C" fn(_: A, ...) -> Ret
1.4.0 · sourceimpl<Ret, A> Ord for unsafe fn(_: A) -> Ret
1.4.0 · sourceimpl<Ret, A> Ord for unsafe extern "C" fn(_: A) -> Ret
1.4.0 · sourceimpl<Ret, A> Ord for unsafe extern "C" fn(_: A, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B> Ord for fn(_: A, _: B) -> Ret
1.4.0 · sourceimpl<Ret, A, B> Ord for extern "C" fn(_: A, _: B) -> Ret
1.4.0 · sourceimpl<Ret, A, B> Ord for extern "C" fn(_: A, _: B, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B> Ord for unsafe fn(_: A, _: B) -> Ret
1.4.0 · sourceimpl<Ret, A, B> Ord for unsafe extern "C" fn(_: A, _: B) -> Ret
1.4.0 · sourceimpl<Ret, A, B> Ord for unsafe extern "C" fn(_: A, _: B, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C> Ord for fn(_: A, _: B, _: C) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C> Ord for extern "C" fn(_: A, _: B, _: C) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C> Ord for extern "C" fn(_: A, _: B, _: C, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C> Ord for unsafe fn(_: A, _: B, _: C) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C> Ord for unsafe extern "C" fn(_: A, _: B, _: C) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C> Ord for unsafe extern "C" fn(_: A, _: B, _: C, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D> Ord for fn(_: A, _: B, _: C, _: D) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D> Ord for extern "C" fn(_: A, _: B, _: C, _: D) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D> Ord for extern "C" fn(_: A, _: B, _: C, _: D, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D> Ord for unsafe fn(_: A, _: B, _: C, _: D) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D> Ord for unsafe extern "C" fn(_: A, _: B, _: C, _: D) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D> Ord for unsafe extern "C" fn(_: A, _: B, _: C, _: D, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E> Ord for fn(_: A, _: B, _: C, _: D, _: E) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E> Ord for extern "C" fn(_: A, _: B, _: C, _: D, _: E) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E> Ord for extern "C" fn(_: A, _: B, _: C, _: D, _: E, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E> Ord for unsafe fn(_: A, _: B, _: C, _: D, _: E) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E> Ord for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E> Ord for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F> Ord for fn(_: A, _: B, _: C, _: D, _: E, _: F) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F> Ord for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F> Ord for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F> Ord for unsafe fn(_: A, _: B, _: C, _: D, _: E, _: F) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F> Ord for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F> Ord for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G> Ord for fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G> Ord for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G> Ord for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G> Ord for unsafe fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G> Ord for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G> Ord for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H> Ord for fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H> Ord for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H> Ord for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H> Ord for unsafe fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H> Ord for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H> Ord for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I> Ord for fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I> Ord for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I> Ord for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I> Ord for unsafe fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I> Ord for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I> Ord for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I, J> Ord for fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I, J> Ord for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I, J> Ord for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I, J> Ord for unsafe fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I, J> Ord for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I, J> Ord for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I, J, K> Ord for fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I, J, K> Ord for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I, J, K> Ord for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I, J, K> Ord for unsafe fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I, J, K> Ord for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I, J, K> Ord for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Ord for fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, _: L) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Ord for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, _: L) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Ord for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, _: L, ...) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Ord for unsafe fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, _: L) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Ord for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, _: L) -> Ret
1.4.0 · sourceimpl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Ord for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, _: L, ...) -> Ret
1.4.0 · sourceimpl<T, const LANES: usize> Ord for Simd<T, LANES> where
LaneCount<LANES>: SupportedLaneCount,
T: SimdElement + Ord,
sourceimpl<T: Ord + Copy> Ord for Cell<T>
1.10.0 · sourceimpl<T: Ord + ?Sized> Ord for ManuallyDrop<T>
1.20.0 · sourceimpl<T: Ord> Ord for Option<T>
sourceimpl<T: Ord> Ord for Poll<T>
1.36.0 · sourceimpl<T: Ord> Ord for [T]
sourceImplements comparison of vectors lexicographically.
impl<T: Ord> Ord for Saturating<T>
sourceimpl<T: Ord> Ord for Wrapping<T>
sourceimpl<T: Ord> Ord for Reverse<T>
1.19.0 · sourceimpl<T: Ord, E: Ord> Ord for Result<T, E>
sourceimpl<T: Ord, const N: usize> Ord for [T; N]
sourceImplements comparison of arrays lexicographically.