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
实现一致,并确保 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
不一致。
综上所述,根据 PartialOrd
的要求,<
定义了严格的总顺序。
这意味着对于所有 a
、b
和 c
:
a < b
、a == b
或 a > b
中恰好有一个为真; and
<
是可传递的: a < b
和 b < c
意味着 a < c
。==
和 >
必须保持相同。
该 trait 可以与 #[derive]
一起使用。
在结构体上 derive
d 时,它将基于结构体成员的自上而下的声明顺序生成 词典 顺序。
对枚举进行派生时,成员按从上到下的判别顺序排序。
词典比较是一种具有以下属性的操作:
- 逐个元素比较两个序列。
- 在字典上,第一个错配元素定义哪个序列比另一个序列小或大。
- 如果一个序列是另一个序列的前缀,则从字典上看,较短的序列比另一个序列小。
- 如果两个序列具有相等的元素并且长度相同,则序列在字典上是相等的。
- 在字典上,空序列比任何非空序列都少。
- 两个空序列在字典上是相等的。
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
}
}
Run
此方法返回 self
和 other
之间的 Ordering
。
按照惯例,如果为 true,则 self.cmp(&other)
返回与表达式 self <operator> other
匹配的顺序。
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
比较并返回两个值中的最大值。
如果比较确定它们相等,则返回第二个参数。
assert_eq!(2, 1.max(2));
assert_eq!(2, 2.max(2));
Run
比较并返回两个值中的最小值。
如果比较确定它们相等,则返回第一个参数。
assert_eq!(1, 1.min(2));
assert_eq!(2, 2.min(2));
Run
将值限制为一定的时间间隔。
如果 self
大于 max
,则返回 max
; 如果 self
小于 min
,则返回 min
。
否则,将返回 self
。
如果为 min > max
,则为 Panics。
assert!((-3).clamp(-2, 1) == -2);
assert!(0.clamp(-2, 1) == 0);
assert!(2.clamp(-2, 1) == 1);
Run
实现字符串排序。
字符串按字节值按 lexicographically 排序。
这将根据 Unicode 代码点在代码图中的位置进行排序。
这不一定与 “alphabetical” 顺序相同,后者因语言和区域设置而异。
根据文化认可的标准对字符串进行排序需要 str
类型的作用域之外的特定于语言环境的数据。
impl<A, B, C, D> Ord for (A, B, C, D) where
C: Ord,
B: Ord,
A: Ord,
D: Ord + ?Sized,
[src]
impl<A, B, C, D, E> Ord for (A, B, C, D, E) where
C: Ord,
E: Ord + ?Sized,
B: Ord,
A: Ord,
D: Ord,
[src]
impl<A, B, C, D, E, F> Ord for (A, B, C, D, E, F) where
C: Ord,
F: Ord + ?Sized,
E: Ord,
B: Ord,
A: Ord,
D: Ord,
[src]
impl<A, B, C, D, E, F, G> Ord for (A, B, C, D, E, F, G) where
C: Ord,
F: Ord,
E: Ord,
B: Ord,
A: Ord,
G: Ord + ?Sized,
D: Ord,
[src]
impl<A, B, C, D, E, F, G, H> Ord for (A, B, C, D, E, F, G, H) where
C: Ord,
F: Ord,
E: Ord,
H: Ord + ?Sized,
B: Ord,
A: Ord,
G: Ord,
D: Ord,
[src]
impl<A, B, C, D, E, F, G, H, I> Ord for (A, B, C, D, E, F, G, H, I) where
C: Ord,
F: Ord,
I: Ord + ?Sized,
E: Ord,
H: Ord,
B: Ord,
A: Ord,
G: Ord,
D: Ord,
[src]
impl<A, B, C, D, E, F, G, H, I, J> Ord for (A, B, C, D, E, F, G, H, I, J) where
C: Ord,
F: Ord,
I: Ord,
E: Ord,
H: Ord,
B: Ord,
A: Ord,
J: Ord + ?Sized,
G: Ord,
D: Ord,
[src]
impl<A, B, C, D, E, F, G, H, I, J, K> Ord for (A, B, C, D, E, F, G, H, I, J, K) where
C: Ord,
F: Ord,
K: Ord + ?Sized,
I: Ord,
E: Ord,
H: Ord,
B: Ord,
A: Ord,
J: Ord,
G: Ord,
D: Ord,
[src]
impl<A, B, C, D, E, F, G, H, I, J, K, L> Ord for (A, B, C, D, E, F, G, H, I, J, K, L) where
C: Ord,
F: Ord,
K: Ord,
I: Ord,
E: Ord,
H: Ord,
B: Ord,
A: Ord,
J: Ord,
G: Ord,
D: Ord,
L: Ord + ?Sized,
[src]
impl<Ret> Ord for extern "C" fn() -> Ret
1.4.0[src]
impl<Ret> Ord for unsafe extern "C" fn() -> Ret
1.4.0[src]
impl<Ret, A> Ord for extern "C" fn(A) -> Ret
1.4.0[src]
impl<Ret, A> Ord for extern "C" fn(A, ...) -> Ret
1.4.0[src]
impl<Ret, A> Ord for unsafe fn(A) -> Ret
1.4.0[src]
impl<Ret, A> Ord for unsafe extern "C" fn(A) -> Ret
1.4.0[src]
impl<Ret, A> Ord for unsafe extern "C" fn(A, ...) -> Ret
1.4.0[src]
impl<Ret, A, B> Ord for extern "C" fn(A, B) -> Ret
1.4.0[src]
impl<Ret, A, B> Ord for extern "C" fn(A, B, ...) -> Ret
1.4.0[src]
impl<Ret, A, B> Ord for unsafe fn(A, B) -> Ret
1.4.0[src]
impl<Ret, A, B> Ord for unsafe extern "C" fn(A, B) -> Ret
1.4.0[src]
impl<Ret, A, B> Ord for unsafe extern "C" fn(A, B, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C> Ord for fn(A, B, C) -> Ret
1.4.0[src]
impl<Ret, A, B, C> Ord for extern "C" fn(A, B, C) -> Ret
1.4.0[src]
impl<Ret, A, B, C> Ord for extern "C" fn(A, B, C, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C> Ord for unsafe fn(A, B, C) -> Ret
1.4.0[src]
impl<Ret, A, B, C> Ord for unsafe extern "C" fn(A, B, C) -> Ret
1.4.0[src]
impl<Ret, A, B, C> Ord for unsafe extern "C" fn(A, B, C, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D> Ord for fn(A, B, C, D) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D> Ord for extern "C" fn(A, B, C, D) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D> Ord for extern "C" fn(A, B, C, D, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D> Ord for unsafe fn(A, B, C, D) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D> Ord for unsafe extern "C" fn(A, B, C, D) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D> Ord for unsafe extern "C" fn(A, B, C, D, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E> Ord for fn(A, B, C, D, E) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E> Ord for extern "C" fn(A, B, C, D, E) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E> Ord for extern "C" fn(A, B, C, D, E, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E> Ord for unsafe fn(A, B, C, D, E) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E> Ord for unsafe extern "C" fn(A, B, C, D, E) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E> Ord for unsafe extern "C" fn(A, B, C, D, E, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F> Ord for fn(A, B, C, D, E, F) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F> Ord for extern "C" fn(A, B, C, D, E, F) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F> Ord for extern "C" fn(A, B, C, D, E, F, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F> Ord for unsafe fn(A, B, C, D, E, F) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F> Ord for unsafe extern "C" fn(A, B, C, D, E, F) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F> Ord for unsafe extern "C" fn(A, B, C, D, E, F, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G> Ord for fn(A, B, C, D, E, F, G) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G> Ord for extern "C" fn(A, B, C, D, E, F, G) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G> Ord for extern "C" fn(A, B, C, D, E, F, G, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G> Ord for unsafe fn(A, B, C, D, E, F, G) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G> Ord for unsafe extern "C" fn(A, B, C, D, E, F, G) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G> Ord for unsafe extern "C" fn(A, B, C, D, E, F, G, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H> Ord for fn(A, B, C, D, E, F, G, H) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H> Ord for extern "C" fn(A, B, C, D, E, F, G, H) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H> Ord for extern "C" fn(A, B, C, D, E, F, G, H, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H> Ord for unsafe fn(A, B, C, D, E, F, G, H) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H> Ord for unsafe extern "C" fn(A, B, C, D, E, F, G, H) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H> Ord for unsafe extern "C" fn(A, B, C, D, E, F, G, H, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I> Ord for fn(A, B, C, D, E, F, G, H, I) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I> Ord for extern "C" fn(A, B, C, D, E, F, G, H, I) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I> Ord for extern "C" fn(A, B, C, D, E, F, G, H, I, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I> Ord for unsafe fn(A, B, C, D, E, F, G, H, I) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I> Ord for unsafe extern "C" fn(A, B, C, D, E, F, G, H, I) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I> Ord for unsafe extern "C" fn(A, B, C, D, E, F, G, H, I, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J> Ord for fn(A, B, C, D, E, F, G, H, I, J) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J> Ord for extern "C" fn(A, B, C, D, E, F, G, H, I, J) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J> Ord for extern "C" fn(A, B, C, D, E, F, G, H, I, J, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J> Ord for unsafe fn(A, B, C, D, E, F, G, H, I, J) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J> Ord for unsafe extern "C" fn(A, B, C, D, E, F, G, H, I, J) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J> Ord for unsafe extern "C" fn(A, B, C, D, E, F, G, H, I, J, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K> Ord for fn(A, B, C, D, E, F, G, H, I, J, K) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K> Ord for extern "C" fn(A, B, C, D, E, F, G, H, I, J, K) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K> Ord for extern "C" fn(A, B, C, D, E, F, G, H, I, J, K, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K> Ord for unsafe fn(A, B, C, D, E, F, G, H, I, J, K) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K> Ord for unsafe extern "C" fn(A, B, C, D, E, F, G, H, I, J, K) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K> Ord for unsafe extern "C" fn(A, B, C, D, E, F, G, H, I, J, K, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Ord for fn(A, B, C, D, E, F, G, H, I, J, K, L) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Ord for extern "C" fn(A, B, C, D, E, F, G, H, I, J, K, L) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Ord for extern "C" fn(A, B, C, D, E, F, G, H, I, J, K, L, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Ord for unsafe fn(A, B, C, D, E, F, G, H, I, J, K, L) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Ord for unsafe extern "C" fn(A, B, C, D, E, F, G, H, I, J, K, L) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Ord for unsafe extern "C" fn(A, B, C, D, E, F, G, H, I, J, K, L, ...) -> Ret
1.4.0[src]
如果当前借用了任一 RefCell
中的值,则会出现 panic。
两个 Rc
的比较。
通过调用 cmp()
的内部值来比较两者。
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()
的内部值来比较两者。
use std::sync::Arc;
use std::cmp::Ordering;
let five = Arc::new(5);
assert_eq!(Ordering::Less, five.cmp(&Arc::new(6)));
Run