pub trait Ord: Eq + PartialOrd<Self> {
// Required method
fn cmp(&self, other: &Self) -> Ordering;
// Provided methods
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 + PartialOrd { ... }
}
Expand description
一个用于形成 全序关系 的类型的 trait。
实现必须与 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)
,请参见 方法文档 (由默认实现确保)。
通过派生一些 traits 并手动实现其他的,很容易意外地使 cmp
和 partial_cmp
不一致。
Corollaries
综上所述,根据 PartialOrd
的要求,<
定义了严格的总顺序。
这意味着对于所有 a
、b
和 c
:
a < b
、a == b
或a > b
中恰好有一个为 true; and<
是可传递的:a < b
和b < c
意味着a < c
。==
和>
必须保持相同。
Derivable
该 trait 可以与 #[derive]
一起使用。
在结构体上 derive
d 时,它将基于结构体成员的自上而下的声明顺序生成 词典 顺序。
当在枚举上 derive
d 时,变体按其判别式排序。
默认情况下,对于顶部的变体,判别式最小,底部变体的判别式最大。下面是一个例子:
#[derive(PartialEq, Eq, PartialOrd, Ord)]
enum E {
Top,
Bottom,
}
assert!(E::Top < E::Bottom);
Run但是,手动设置判别式可以覆盖此默认行为:
#[derive(PartialEq, Eq, PartialOrd, Ord)]
enum E {
Top = 2,
Bottom = 1,
}
assert!(E::Bottom < E::Top);
Run词典比较
词典比较是一种具有以下属性的操作:
- 逐个元素比较两个序列。
- 第一个不匹配元素定义了哪个序列在词典上小于或大于另一个序列。
- 如果一个序列是另一个序列的前缀,则从字典上看,较短的序列比另一个序列小。
- 如果两个序列具有相等的元素并且长度相同,则序列在字典上是相等的。
- 在字典上,空序列比任何非空序列都少。
- 两个空序列在字典上是相等的。
如何实现 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
}
}
RunRequired Methods§
Provided Methods§
1.50.0 · sourcefn clamp(self, min: Self, max: Self) -> Selfwhere
Self: Sized + PartialOrd,
fn clamp(self, min: Self, max: Self) -> Selfwhere Self: Sized + PartialOrd,
Implementors§
impl Ord for AsciiChar
impl Ord for Infallible
impl Ord for IpAddr
impl Ord for SocketAddr
impl Ord for Which
impl Ord for Ordering
impl Ord for bool
impl Ord for char
impl Ord for i8
impl Ord for i16
impl Ord for i32
impl Ord for i64
impl Ord for i128
impl Ord for isize
impl Ord for !
impl Ord for str
实现字符串排序。
字符串按字节值按 按字典顺序 排序。
这将根据 Unicode 代码点在代码图中的位置进行排序。
这不一定与 “alphabetical” 顺序相同,后者因语言和区域设置而异。
根据文化认可的标准对字符串进行排序需要 str
类型的作用域之外的特定于语言环境的数据。
impl Ord for u8
impl Ord for u16
impl Ord for u32
impl Ord for u64
impl Ord for u128
impl Ord for ()
impl Ord for usize
impl Ord for TypeId
impl Ord for CpuidResult
Available on x86 or x86-64 only.
impl Ord for CStr
impl Ord for Error
impl Ord for PhantomPinned
impl Ord for Ipv4Addr
impl Ord for Ipv6Addr
impl Ord for SocketAddrV4
impl Ord for SocketAddrV6
impl Ord for NonZeroI8
impl Ord for NonZeroI16
impl Ord for NonZeroI32
impl Ord for NonZeroI64
impl Ord for NonZeroI128
impl Ord for NonZeroIsize
impl Ord for NonZeroU8
impl Ord for NonZeroU16
impl Ord for NonZeroU32
impl Ord for NonZeroU64
impl Ord for NonZeroU128
impl Ord for NonZeroUsize
impl Ord for Alignment
impl Ord for Duration
impl<'a> Ord for Location<'a>
impl<A> Ord for &Awhere A: Ord + ?Sized,
impl<A> Ord for &mut Awhere A: Ord + ?Sized,
impl<Dyn: ?Sized> Ord for DynMetadata<Dyn>
impl<F: FnPtr> Ord for F
impl<P: Deref<Target: Ord>> Ord for Pin<P>
impl<T> Ord for (T₁, T₂, …, Tₙ)where T: ?Sized + Ord,
This trait is implemented for tuples up to twelve items long.
impl<T, const N: usize> Ord for Simd<T, N>where LaneCount<N>: SupportedLaneCount, T: SimdElement + Ord,
impl<T: Ord + Copy> Ord for Cell<T>
impl<T: Ord + ?Sized> Ord for ManuallyDrop<T>
impl<T: Ord> Ord for Option<T>
impl<T: Ord> Ord for Poll<T>
impl<T: Ord> Ord for [T]
实现 vectors 按字典顺序 的比较。
impl<T: Ord> Ord for Saturating<T>
impl<T: Ord> Ord for Wrapping<T>
impl<T: Ord> Ord for Reverse<T>
impl<T: Ord, E: Ord> Ord for Result<T, E>
impl<T: Ord, const N: usize> Ord for [T; N]
实现数组 按字典顺序 的比较。