当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust Ord用法及代码示例


本文简要介绍rust语言中 Trait std::cmp::Ord 的用法。

用法

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 { ... }
}

形成 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) ,请参阅方法文档(由默认实现确保)。

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

推论

从以上和 PartialOrd 的要求来看,< 定义了严格的总顺序。这意味着对于所有 abc

  • a < ba == ba > b 中的一个为真;和
  • < 是传递性的: a < bb < c 意味着 a < c 。对于 ==> 也必须如此。

可导出的

此特征可以与 #[derive] 一起使用。当 derive 作用于结构时,它将根据结构成员从上到下的声明顺序生成 lexicographic 排序。当 derive d 在枚举上时,变体按其从上到下的判别顺序进行排序。这意味着顶部的变体少于底部的变体。这是一个例子:

#[derive(PartialEq, PartialOrd)]
enum Size {
    Small,
    Large,
}

assert!(Size::Small < Size::Large);

字典比较

字典比较是具有以下属性的操作:

  • 两个序列逐个元素进行比较。
  • 第一个不匹配元素定义了哪个序列在字典上小于或大于另一个。
  • 如果一个序列是另一个序列的前缀,则较短的序列在字典上比另一个序列少。
  • 如果两个序列有等价的元素并且长度相同,那么这两个序列在字典上是相等的。
  • 空序列按字典顺序小于任何非空序列。
  • 两个空序列在字典上是相等的。

如何实现 Ord

Ord 要求类型也是 PartialOrd Eq (需要 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
    }
}

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Trait std::cmp::Ord。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。