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

pub trait PartialOrd<Rhs: ?Sized = Self>: PartialEq<Rhs> {
    fn partial_cmp(&self, other: &Rhs) -> Option<Ordering>;

    fn lt(&self, other: &Rhs) -> bool { ... }
fn le(&self, other: &Rhs) -> bool { ... }
fn gt(&self, other: &Rhs) -> bool { ... }
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 > b 并且 b > c,则 a > c
  • partial_cmp 的对偶性: partial_cmp(a, b) == partial_cmp(b, a).map(Ordering::reverse)

Derivable

该 trait 可以与 #[derive] 一起使用。当在结构体上进行 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

Implementors

对字符串执行比较操作。

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

实现 vectors 按字典顺序 的比较。