Trait std::cmp::Ord

1.0.0 · source ·
pub trait Ord: Eq + PartialOrd<Self> {
    // Required method
    fn cmp(&self, other: &Self) -> Ordering;

    // Provided methods
    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 + PartialOrd<Self> { ... }
}
Expand description

一个用于形成 全序关系 的类型的 trait。

实现必须与 PartialOrd 实现一致,并确保 maxminclampcmp 一致:

  • partial_cmp(a, b) == Some(cmp(a, b)).
  • max(a, b) == max_by(a, b, cmp) (由默认实现确保)。
  • min(a, b) == min_by(a, b, cmp) (由默认实现确保)。
  • 对于 a.clamp(min, max),请参见 方法文档 (由默认实现确保)。

通过派生一些 traits 并手动实现其他的,很容易意外地使 cmppartial_cmp 不一致。

Corollaries

综上所述,根据 PartialOrd 的要求,< 定义了严格的总顺序。 这意味着对于所有 abc

  • a < ba == ba > b 中恰好有一个为 true; and
  • < 是可传递的: a < bb < c 意味着 a < c==> 必须保持相同。

Derivable

该 trait 可以与 #[derive] 一起使用。

在结构体上 derive d 时,它将基于结构体成员的自上而下的声明顺序生成 词典 顺序。

当在枚举上 derived 时,变体按其判别式排序。 默认情况下,对于顶部的变体,判别式最小,底部变体的判别式最大。下面是一个例子:

#[derive(PartialEq, Eq, PartialOrd, Ord)]
enum E {
    Top,
    Bottom,
}

assert!(E::Top < E::Bottom);
Run

但是,手动设置判别式可以覆盖此默认行为:

#[derive(PartialEq, Eq, PartialOrd, Ord)]
enum E {
    Top = 2,
    Bottom = 1,
}

assert!(E::Bottom < E::Top);
Run

词典比较

词典比较是一种具有以下属性的操作:

  • 逐个元素比较两个序列。
  • 第一个不匹配元素定义了哪个序列在词典上小于或大于另一个序列。
  • 如果一个序列是另一个序列的前缀,则从字典上看,较短的序列比另一个序列小。
  • 如果两个序列具有相等的元素并且长度相同,则序列在字典上是相等的。
  • 在字典上,空序列比任何非空序列都少。
  • 两个空序列在字典上是相等的。

如何实现 Ord

Ord 要求类型也是 PartialOrdEq (需要 PartialEq)。

然后,您必须定义 cmp 的实现。您可能会发现在类型的字段上使用 cmp 很有用。

这是一个示例,您只想按高度对人员进行排序,而不考虑 idname

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§

source

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

此方法返回 selfother 之间的 Ordering

按照惯例,如果为 true,则 self.cmp(&other) 返回与表达式 self <operator> other 匹配的顺序。

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) -> Selfwhere Self: Sized,

比较并返回两个值中的最大值。

如果比较确定它们相等,则返回第二个参数。

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

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

比较并返回两个值中的最小值。

如果比较确定它们相等,则返回第一个参数。

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

fn clamp(self, min: Self, max: Self) -> Selfwhere Self: Sized + PartialOrd<Self>,

将值限制在某个时间间隔内。

如果 self 大于 max,则返回 max; 如果 self 小于 min,则返回 min。 否则,将返回 self

Panics

如果 min > max,就会出现 panics。

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

Implementors§

source§

impl Ord for AsciiChar

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

source§

impl Ord for Ordering

source§

impl Ord for bool

source§

impl Ord for char

source§

impl Ord for i8

source§

impl Ord for i16

source§

impl Ord for i32

source§

impl Ord for i64

source§

impl Ord for i128

source§

impl Ord for isize

source§

impl Ord for !

source§

impl Ord for str

实现字符串排序。

字符串按字节值按 按字典顺序 排序。 这将根据 Unicode 代码点在代码图中的位置进行排序。 这不一定与 “alphabetical” 顺序相同,后者因语言和区域设置而异。 根据文化认可的标准对字符串进行排序需要 str 类型的作用域之外的特定于语言环境的数据。

source§

impl Ord for u8

source§

impl Ord for u16

source§

impl Ord for u32

source§

impl Ord for u64

source§

impl Ord for u128

source§

impl Ord for ()

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<'_>

const: unstable · source§

impl Ord for Alignment

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 &Awhere A: Ord + ?Sized,

source§

impl<A> Ord for &mut Awhere 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,

1.4.0 · source§

impl<F> Ord for Fwhere F: FnPtr,

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,

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 Twhere T: ?Sized,

source§

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

source§

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

实现 vectors 按字典顺序 的比较。

source§

impl<T> Ord for (T₁, T₂, …, Tₙ)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 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 LinkedList<T, A>where T: Ord, A: Allocator,

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,

实现 vectors、lexicographically 的排序。

source§

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

source§

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

实现数组 按字典顺序 的比较。

source§

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

source§

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