本文简要介绍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
实现一致,并确保 max
、 min
和 clamp
与 cmp
一致:
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)
,请参阅方法文档(由默认实现确保)。
通过派生一些特征并手动实现其他特征,很容易意外地使cmp
和partial_cmp
不一致。
推论
从以上和 PartialOrd
的要求来看,<
定义了严格的总顺序。这意味着对于所有 a
、 b
和 c
:
a < b
、a == b
或a > b
中的一个为真;和<
是传递性的:a < b
和b < 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
很有用。
这是一个示例,您只想按身高对人员进行排序,而忽略 id
和 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
}
}
相关用法
- Rust Ordering.then用法及代码示例
- Rust Ordering.is_eq用法及代码示例
- Rust Ordering用法及代码示例
- Rust Ord.cmp用法及代码示例
- Rust Ordering.is_gt用法及代码示例
- Rust Ord.min用法及代码示例
- Rust Ord.max用法及代码示例
- Rust Ordering.is_le用法及代码示例
- Rust Ordering.is_lt用法及代码示例
- Rust Ordering.then_with用法及代码示例
- Rust Ordering.is_ge用法及代码示例
- Rust Ord.clamp用法及代码示例
- Rust Ordering.is_ne用法及代码示例
- Rust Ordering.reverse用法及代码示例
- Rust OsStr.to_ascii_uppercase用法及代码示例
- Rust Option.unwrap_or_default用法及代码示例
- Rust Octal用法及代码示例
- Rust Option.as_deref_mut用法及代码示例
- Rust Once.call_once用法及代码示例
- Rust Option.get_or_insert_with用法及代码示例
- Rust OnceCell用法及代码示例
- Rust Option.iter_mut用法及代码示例
- Rust OsStr.make_ascii_lowercase用法及代码示例
- Rust OsString.clear用法及代码示例
- Rust OpenOptionsExt.custom_flags用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Trait std::cmp::Ord。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。