當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Rust PartialOrd用法及代碼示例


本文簡要介紹rust語言中 Trait core::cmp::PartialOrd 的用法。

用法

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 { ... }
}

可以比較 sort-order 的值的特征。

可以分別使用 <<=>>= 運算符調用此特征的 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 一致(有關確切要求,請參閱該特征的文檔)。通過派生一些特征並手動實現其他特征,很容易意外地使他們不同意。

對於所有 abc ,比較必須滿足:

  • 傳遞性: a < bb < c 意味著 a < c 。對於 ==> 也必須如此。
  • 對偶性: a < b 當且僅當 b > a

請注意,這些要求意味著特征本身必須對稱且傳遞地實現: if T: PartialOrd<U> and U: PartialOrd<V> then U: PartialOrd<T> and T: PartialOrd<V>

推論

以下推論來自上述要求:

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

可導出的

此特征可與 #[derive] 一起使用。當 derive d 在結構上時,它將根據結構成員的從上到下的聲明順序生成字典順序。當 derive d 在枚舉上時,變體按其從上到下的判別順序排序。

如何實現 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
    }
}

您可能還會發現在類型的字段上使用 partial_cmp 很有用。以下是具有浮點 height 字段的 Person 類型的示例,該字段是唯一用於排序的字段:

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
    }
}

例子

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

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

相關用法


注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Trait core::cmp::PartialOrd。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。