Trait core::cmp::Ord1.0.0[][src]

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。

实现必须与 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, PartialOrd)]
enum Size {
    Small,
    Large,
}

assert!(Size::Small < Size::Large);
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

此方法返回 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

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

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

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

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

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

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

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

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

Panics

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

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

Implementors

实现字符串排序。

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

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

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

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

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

impl<K: Ord, V: Ord> Ord for BTreeMap<K, V>

impl<T: Ord> Ord for BTreeSet<T>

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

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

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

impl Ord for String

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

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