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

pub trait Ord: Eq + PartialOrd<Self> {
    #[must_use]
    fn cmp(&self, other: &Self) -> Ordering;

    #[must_use]
    fn max(self, other: Self) -> Self { ... }
#[must_use] fn min(self, other: Self) -> Self { ... }
#[must_use] fn clamp(self, min: Self, max: Self) -> Self { ... } }
Expand description

Trait 用于形成 total order 的类型。

实现必须与 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 中恰好有一个为真; and
  • < 是可传递的: a < bb < c 意味着 a < c==> 必须保持相同。

Derivable

该 trait 可以与 #[derive] 一起使用。 在结构体上 derive d 时,它将基于结构体成员的自上而下的声明顺序生成 词典 顺序。

对枚举进行派生时,成员按从上到下的判别顺序排序。

词典比较

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

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

如何实现 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

Implementations on Foreign Types

Implementors

实现字符串排序。

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

实现 vectors lexicographically 的比较。

Panics

如果当前借用了任一 RefCell 中的值,则会出现 panic。

两个 Rc 的比较。

通过调用 cmp() 的内部值来比较两者。

Examples

use std::rc::Rc;
use std::cmp::Ordering;

let five = Rc::new(5);

assert_eq!(Ordering::Less, five.cmp(&Rc::new(6)));
Run

两个 Arc 的比较。

通过调用 cmp() 的内部值来比较两者。

Examples

use std::sync::Arc;
use std::cmp::Ordering;

let five = Arc::new(5);

assert_eq!(Ordering::Less, five.cmp(&Arc::new(6)));
Run

实现 vectors 的排序, lexicographically.

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