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


Rust Ord用法及代碼示例


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

用法

pub trait Ord: Eq + PartialOrd<Self> {
    fn cmp(&self, other: &Self) -> Ordering;

    fn max(self, other: Self) -> Self { ... }
    fn min(self, other: Self) -> Self { ... }
    fn clamp(self, min: Self, max: Self) -> Self { ... }
}

形成 total order 的類型的特征。

實現必須與 PartialOrd 實現一致,並確保 maxminclampcmp 一致:

  • 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) ,請參閱方法文檔(由默認實現確保)。

通過派生一些特征並手動實現其他特征,很容易意外地使cmppartial_cmp 不一致。

推論

從以上和 PartialOrd 的要求來看,< 定義了嚴格的總順序。這意味著對於所有 abc

  • a < ba == ba > b 中的一個為真;和
  • < 是傳遞性的: a < bb < c 意味著 a < c 。對於 ==> 也必須如此。

可導出的

此特征可以與 #[derive] 一起使用。當 derive 作用於結構時,它將根據結構成員從上到下的聲明順序生成 lexicographic 排序。當 derive d 在枚舉上時,變體按其從上到下的判別順序進行排序。這意味著頂部的變體少於底部的變體。這是一個例子:

#[derive(PartialEq, PartialOrd)]
enum Size {
    Small,
    Large,
}

assert!(Size::Small < Size::Large);

字典比較

字典比較是具有以下屬性的操作:

  • 兩個序列逐個元素進行比較。
  • 第一個不匹配元素定義了哪個序列在字典上小於或大於另一個。
  • 如果一個序列是另一個序列的前綴,則較短的序列在字典上比另一個序列少。
  • 如果兩個序列有等價的元素並且長度相同,那麽這兩個序列在字典上是相等的。
  • 空序列按字典順序小於任何非空序列。
  • 兩個空序列在字典上是相等的。

如何實現 Ord

Ord 要求類型也是 PartialOrd Eq (需要 PartialEq )。

然後,您必須為 cmp 定義一個實現。您可能會發現在類型的字段上使用 cmp 很有用。

這是一個示例,您隻想按身高對人員進行排序,而忽略 idname

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

相關用法


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