logo

Trait std::cmp::Ord

1.0.0 · source ·
pub trait Ord: Eq + PartialOrd<Self> {
 fn cmp(&self, other: &Self) -> Ordering;
 fn max(self, other: Self) -> Self { ... }
 fn min(self, other: Self) -> Self { ... }
 fn clamp(self, min: Self, max: Self) -> Self
where
Self: PartialOrd<Self>
, { ... } }
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 == b or a > b is true; and
  • < is transitive: a < b and b < c implies a < 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);
Run

However, 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);
Run

Lexicographical 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
 }
}
Run

Required Methods

fn cmp(&self, other: &Self) -> Ordering

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);
Run

Provided Methods

1.21.0 · source

fn max(self, other: Self) -> Self

Compares and returns the maximum of two values.

Returns the second argument if the comparison determines them to be equal.

Examples
assert_eq!(2, 1.max(2));
assert_eq!(2, 2.max(2));
Run
1.21.0 · source

fn min(self, other: Self) -> Self

Compares and returns the minimum of two values.

Returns the first argument if the comparison determines them to be equal.

Examples
assert_eq!(1, 1.min(2));
assert_eq!(2, 2.min(2));
Run
1.50.0 · source

fn clamp(self, min: Self, max: Self) -> Self where
Self: PartialOrd<Self>,

Restrict a value to a certain interval.

Returns max if self is greater than max, and min if self is less than min. Otherwise this returns self.

Panics

Panics if min > max.

Examples
assert!((-3).clamp(-2, 1) == -2);
assert!(0.clamp(-2, 1) == 0);
assert!(2.clamp(-2, 1) == 1);
Run

Implementors

1.34.0 · source

impl Ord for Infallible

source

impl Ord for ErrorKind

1.7.0 · source

impl Ord for IpAddr

source

impl Ord for SocketAddr

source

impl Ord for Which

const: unstable · source

impl Ord for Ordering

const: unstable · source

impl Ord for bool

const: unstable · source

impl Ord for char

const: unstable · source

impl Ord for i8

const: unstable · source

impl Ord for i16

const: unstable · source

impl Ord for i32

const: unstable · source

impl Ord for i64

const: unstable · source

impl Ord for i128

const: unstable · source

impl Ord for isize

const: unstable · source

impl Ord for !

source

impl Ord for str

Implements 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.

const: unstable · source

impl Ord for u8

const: unstable · source

impl Ord for u16

const: unstable · source

impl Ord for u32

const: unstable · source

impl Ord for u64

const: unstable · source

impl Ord for u128

const: unstable · source

impl Ord for ()

const: unstable · source

impl Ord for usize

1.27.0 · source

impl Ord for CpuidResult

source

impl Ord for TypeId

source

impl Ord for CStr

1.64.0 · source

impl Ord for CString

source

impl Ord for OsStr

source

impl Ord for OsString

source

impl Ord for Error

1.33.0 · source

impl Ord for PhantomPinned

source

impl Ord for Ipv4Addr

source

impl Ord for Ipv6Addr

1.45.0 · source

impl Ord for SocketAddrV4

1.45.0 · source

impl Ord for SocketAddrV6

1.34.0 · source

impl Ord for NonZeroI8

1.34.0 · source

impl Ord for NonZeroI16

1.34.0 · source

impl Ord for NonZeroI32

1.34.0 · source

impl Ord for NonZeroI64

1.34.0 · source

impl Ord for NonZeroI128

1.34.0 · source

impl Ord for NonZeroIsize

1.28.0 · source

impl Ord for NonZeroU8

1.28.0 · source

impl Ord for NonZeroU16

1.28.0 · source

impl Ord for NonZeroU32

1.28.0 · source

impl Ord for NonZeroU64

1.28.0 · source

impl Ord for NonZeroU128

1.28.0 · source

impl Ord for NonZeroUsize

source

impl Ord for Components<'_>

source

impl Ord for Path

source

impl Ord for PathBuf

source

impl Ord for PrefixComponent<'_>

source

impl Ord for String

1.3.0 · source

impl Ord for Duration

1.8.0 · source

impl Ord for Instant

1.8.0 · source

impl Ord for SystemTime

source

impl<'a> Ord for Component<'a>

source

impl<'a> Ord for Prefix<'a>

1.10.0 · source

impl<'a> Ord for Location<'a>

source

impl<A> Ord for &A where
A: Ord + ?Sized,

source

impl<A> Ord for &mut A where
A: Ord + ?Sized,

source

impl<B> Ord for Cow<'_, B> where
B: Ord + ToOwned + ?Sized,

source

impl<Dyn> Ord for DynMetadata<Dyn> where
Dyn: ?Sized,

source

impl<K, V, A> Ord for BTreeMap<K, V, A> where
K: Ord,
V: Ord,
A: Allocator + Clone,

1.41.0 · source

impl<P> Ord for Pin<P> where
P: Deref,
<P as Deref>::Target: Ord,

1.4.0 · source

impl<Ret, T> Ord for fn (T1, T2, ..., Tn) -> Ret

This trait is implemented for function pointers with up to twelve arguments.

1.4.0 · source

impl<Ret, T> Ord for extern "C" fn (T1, T2, ..., Tn) -> Ret

This trait is implemented for function pointers with up to twelve arguments.

1.4.0 · source

impl<Ret, T> Ord for extern "C" fn (T1, T2, ..., Tn, ...) -> Ret

This trait is implemented for function pointers with up to twelve arguments.

1.4.0 · source

impl<Ret, T> Ord for unsafe fn (T1, T2, ..., Tn) -> Ret

This trait is implemented for function pointers with up to twelve arguments.

1.4.0 · source

impl<Ret, T> Ord for unsafe extern "C" fn (T1, T2, ..., Tn) -> Ret

This trait is implemented for function pointers with up to twelve arguments.

1.4.0 · source

impl<Ret, T> Ord for unsafe extern "C" fn (T1, T2, ..., Tn, ...) -> Ret

This trait is implemented for function pointers with up to twelve arguments.

source

impl<T> Ord for Option<T> where
T: Ord,

1.36.0 · source

impl<T> Ord for Poll<T> where
T: Ord,

source

impl<T> Ord for *const T where
T: ?Sized,

source

impl<T> Ord for *mut T where
T: ?Sized,

source

impl<T> Ord for [T] where
T: Ord,

Implements comparison of vectors lexicographically.

source

impl<T> Ord for (T1, T2, ..., Tn) where
T: Ord + ?Sized,

This trait is implemented for tuples up to twelve items long.

1.10.0 · source

impl<T> Ord for Cell<T> where
T: Ord + Copy,

1.10.0 · source

impl<T> Ord for RefCell<T> where
T: Ord + ?Sized,

source

impl<T> Ord for LinkedList<T> where
T: Ord,

source

impl<T> Ord for PhantomData<T> where
T: ?Sized,

1.20.0 · source

impl<T> Ord for ManuallyDrop<T> where
T: Ord + ?Sized,

source

impl<T> Ord for Saturating<T> where
T: Ord,

source

impl<T> Ord for Wrapping<T> where
T: Ord,

1.25.0 · source

impl<T> Ord for NonNull<T> where
T: ?Sized,

source

impl<T> Ord for Rc<T> where
T: Ord + ?Sized,

source

impl<T> Ord for Arc<T> where
T: Ord + ?Sized,

1.19.0 · source

impl<T> Ord for Reverse<T> where
T: Ord,

source

impl<T, A> Ord for Box<T, A> where
T: Ord + ?Sized,
A: Allocator,

source

impl<T, A> Ord for BTreeSet<T, A> where
T: Ord,
A: Allocator + Clone,

source

impl<T, A> Ord for VecDeque<T, A> where
T: Ord,
A: Allocator,

source

impl<T, A> Ord for Vec<T, A> where
T: Ord,
A: Allocator,

Implements ordering of vectors, lexicographically.

source

impl<T, E> Ord for Result<T, E> where
T: Ord,
E: Ord,

source

impl<T, const LANES: usize> Ord for Simd<T, LANES> where
T: SimdElement + Ord,
LaneCount<LANES>: SupportedLaneCount,

source

impl<T, const N: usize> Ord for [T; N] where
T: Ord,

Implements comparison of arrays lexicographically.

source

impl<Y, R> Ord for GeneratorState<Y, R> where
Y: Ord,
R: Ord,

AltStyle によって変換されたページ (->オリジナル) /