Trait std::cmp::PartialOrd1.0.0[][src]

pub trait PartialOrd<Rhs = Self>: PartialEq<Rhs> where
    Rhs: ?Sized
{ #[must_use] fn partial_cmp(&self, other: &Rhs) -> Option<Ordering>; #[must_use] fn lt(&self, other: &Rhs) -> bool { ... }
#[must_use] fn le(&self, other: &Rhs) -> bool { ... }
#[must_use] fn gt(&self, other: &Rhs) -> bool { ... }
#[must_use] fn ge(&self, other: &Rhs) -> bool { ... } }
Expand description

Trait 表示可以按排序顺序比较的值。

此 trait 的 ltlegtge 方法可以分别使用 <<=>>= 相互调用。

这个 trait 的方法必须相互一致,并且在以下意义上与 PartialEq 的方法一致:

  • a == b 当且仅当 partial_cmp(a, b) == Some(Equal)
  • a < b 当且仅当 partial_cmp(a, b) == Some(Less) (由默认实现确保)。
  • a > b 当且仅当 partial_cmp(a, b) == Some(Greater) (由默认实现确保)。
  • a <= b 当且仅当 a < b || a == b (由默认实现确保)。
  • a >= b 当且仅当 a > b || a == b (由默认实现确保)。
  • a != b 当且仅当 !(a == b) (已经是 PartialEq 的一部分)。

如果 Ord 也为 SelfRhs 实现,它也必须与 partial_cmp 一致 (具体要求请参见 trait 的文档)。 通过派生一些 traits 并手动实现其他一些行为,很容易使它们不以为然。

对于所有 abc,比较必须满足:

  • 可传递性: a < bb < c 表示 a < c==> 必须保持相同。
  • 二元性: a < b 当且仅当 b > a

请注意,这些要求意味着 trait 本身必须对称且可传递地实现: 如果 T: PartialOrd<U>U: PartialOrd<V>,则 U: PartialOrd<T>T: PartialOrd<V>

Corollaries

从上述要求得出以下推论:

  • <> 的非自反性: !(a < a)!(a > a)
  • > 的传递性: 如果 a > bb > ca > c
  • partial_cmp 的二元性: partial_cmp(a, b) == partial_cmp(b, a).map(Ordering::reverse)

Derivable

该 trait 可以与 #[derive] 一起使用。当在结构体上进行 derived 时,它将根据结构体成员的自上而下的声明顺序生成字典顺序。 对枚举进行派生时,成员按从上到下的判别顺序排序。

如何实现 PartialOrd?

PartialOrd 仅需要 partial_cmp 方法的实现,而其他方法则是从默认实现中生成的。

但是,对于没有总顺序的类型,仍然可以单独实现其他类型。例如,对于浮点数,NaN < 0 == falseNaN >= 0 == false (参见 IEEE 754-2008 第 5.11 节)。

PartialOrd 要求您输入 PartialEq

如果您的类型是 Ord,则可以使用 cmp 来实现 partial_cmp:

use std::cmp::Ordering;

#[derive(Eq)]
struct Person {
    id: u32,
    name: String,
    height: u32,
}

impl PartialOrd for Person {
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
        Some(self.cmp(other))
    }
}

impl Ord for Person {
    fn cmp(&self, other: &Self) -> Ordering {
        self.height.cmp(&other.height)
    }
}

impl PartialEq for Person {
    fn eq(&self, other: &Self) -> bool {
        self.height == other.height
    }
}
Run

您可能还会发现在类型的字段上使用 partial_cmp 很有用。这是 Person 类型的示例,它们具有一个浮点 height 字段,该字段是唯一用于排序的字段:

use std::cmp::Ordering;

struct Person {
    id: u32,
    name: String,
    height: f64,
}

impl PartialOrd for Person {
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
        self.height.partial_cmp(&other.height)
    }
}

impl PartialEq for Person {
    fn eq(&self, other: &Self) -> bool {
        self.height == other.height
    }
}
Run

Examples

let x : u32 = 0;
let y : u32 = 1;

assert_eq!(x < y, true);
assert_eq!(x.lt(&y), true);
Run

Required methods

如果存在,则此方法返回 selfother 值之间的顺序。

Examples

use std::cmp::Ordering;

let result = 1.0.partial_cmp(&2.0);
assert_eq!(result, Some(Ordering::Less));

let result = 1.0.partial_cmp(&1.0);
assert_eq!(result, Some(Ordering::Equal));

let result = 2.0.partial_cmp(&1.0);
assert_eq!(result, Some(Ordering::Greater));
Run

如果无法进行比较:

let result = f64::NAN.partial_cmp(&1.0);
assert_eq!(result, None);
Run

Provided methods

此方法测试的内容少于 (对于 selfother),并且由 < 操作员使用。

Examples

let result = 1.0 < 2.0;
assert_eq!(result, true);

let result = 2.0 < 1.0;
assert_eq!(result, false);
Run

此方法测试小于或等于 (对于 selfother),并且由 <= 运算符使用。

Examples

let result = 1.0 <= 2.0;
assert_eq!(result, true);

let result = 2.0 <= 2.0;
assert_eq!(result, true);
Run

此方法测试大于 (对于 selfother),并且由 > 操作员使用。

Examples

let result = 1.0 > 2.0;
assert_eq!(result, false);

let result = 2.0 > 2.0;
assert_eq!(result, false);
Run

此方法测试是否大于或等于 (对于 selfother),并且由 >= 运算符使用。

Examples

let result = 2.0 >= 1.0;
assert_eq!(result, true);

let result = 2.0 >= 2.0;
assert_eq!(result, true);
Run

Implementations on Foreign Types

Implementors

对字符串执行比较操作。

lexicographically 通过字符串的字节值对字符串进行比较。 这将根据 Unicode 代码点在代码表中的位置进行比较。 这不一定与 “alphabetical” 顺序相同,后者因语言和区域设置而异。 根据文化认可的标准比较字符串需要特定于语言环境的数据,该数据不在 str 类型的作用域之内。

实现 vectors lexicographically 的比较。

Panics

如果当前借用了任一 RefCell 中的值,则会出现 panic。

Panics

如果当前借用了任一 RefCell 中的值,则会出现 panic。

Panics

如果当前借用了任一 RefCell 中的值,则会出现 panic。

Panics

如果当前借用了任一 RefCell 中的值,则会出现 panic。

Panics

如果当前借用了任一 RefCell 中的值,则会出现 panic。

两个 Rc 的部分比较。

通过调用 partial_cmp() 的内部值来比较两者。

Examples

use std::rc::Rc;
use std::cmp::Ordering;

let five = Rc::new(5);

assert_eq!(Some(Ordering::Less), five.partial_cmp(&Rc::new(6)));
Run

小于两个 Rc 的比较。

通过调用 < 的内部值来比较两者。

Examples

use std::rc::Rc;

let five = Rc::new(5);

assert!(five < Rc::new(6));
Run

两个 Rc 的小于或等于比较。

通过调用 <= 的内部值来比较两者。

Examples

use std::rc::Rc;

let five = Rc::new(5);

assert!(five <= Rc::new(5));
Run

大于两个 Rc 的比较。

通过调用 > 的内部值来比较两者。

Examples

use std::rc::Rc;

let five = Rc::new(5);

assert!(five > Rc::new(4));
Run

两个 Rc 的大于或等于比较。

通过调用 >= 的内部值来比较两者。

Examples

use std::rc::Rc;

let five = Rc::new(5);

assert!(five >= Rc::new(5));
Run

两个 Arc 的部分比较。

通过调用 partial_cmp() 的内部值来比较两者。

Examples

use std::sync::Arc;
use std::cmp::Ordering;

let five = Arc::new(5);

assert_eq!(Some(Ordering::Less), five.partial_cmp(&Arc::new(6)));
Run

小于两个 Arc 的比较。

通过调用 < 的内部值来比较两者。

Examples

use std::sync::Arc;

let five = Arc::new(5);

assert!(five < Arc::new(6));
Run

两个 Arc 的小于或等于比较。

通过调用 <= 的内部值来比较两者。

Examples

use std::sync::Arc;

let five = Arc::new(5);

assert!(five <= Arc::new(5));
Run

大于两个 Arc 的比较。

通过调用 > 的内部值来比较两者。

Examples

use std::sync::Arc;

let five = Arc::new(5);

assert!(five > Arc::new(4));
Run

两个 Arc 的大于或等于比较。

通过调用 >= 的内部值来比较两者。

Examples

use std::sync::Arc;

let five = Arc::new(5);

assert!(five >= Arc::new(5));
Run

实现 vectors 的比较, lexicographically.