本文簡要介紹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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。