一、源碼
這段代碼定義了一個標記特征(marker trait)Ord 和三個實現,用于將類型標記與 Rust 標準庫中的 Ordering 枚舉關聯起來。
use crate::sealed::Sealed;
use core::cmp::Ordering;
use crate::number::{Greater, Equal, Less};
/// 用于標記類型 `Greater`、`Equal` 和 `Less` 的**標記特征**
pub trait Ord: Sealed {fn to_ordering() -> Ordering;
}/// 返回 `core::cmp::Ordering::Greater`
impl Ord for Greater {#[inline]fn to_ordering() -> Ordering {Ordering::Greater}
}/// 返回 `core::cmp::Ordering::Less`
impl Ord for Less {#[inline]fn to_ordering() -> Ordering {Ordering::Less}
}/// 返回 `core::cmp::Ordering::Equal`
impl Ord for Equal {#[inline]fn to_ordering() -> Ordering {Ordering::Equal}
}
二、源碼分析
- 導入和特征定義
use crate::sealed::Sealed;
use core::cmp::Ordering;
use crate::number::{Greater, Equal, Less};pub trait Ord: Sealed {fn to_ordering() -> Ordering;
}
-
Sealed: 這是一個標記特征,用于限制特征只能被當前 crate 中的類型實現(密封模式,防止外部實現)。
-
Ordering: Rust 標準庫中的枚舉,表示比較結果(Less、Equal、Greater)。
-
Greater/Equal/Less: 用戶定義的標記類型(零大小類型,ZST)。
-
Ord trait: 定義了一個關聯函數 to_ordering(),返回 Ordering 值。它要求實現者必須也實現 Sealed(確保只有當前 crate 能實現它)。
- 為 Greater、Equal、Less 實現 Ord
impl Ord for Greater {#[inline]fn to_ordering() -> Ordering {Ordering::Greater}
}impl Ord for Less {#[inline]fn to_ordering() -> Ordering {Ordering::Less}
}impl Ord for Equal {#[inline]fn to_ordering() -> Ordering {Ordering::Equal}
}
-
為三個標記類型分別實現 Ord trait:
-
Greater → 返回 Ordering::Greater。
-
Less → 返回 Ordering::Less。
-
Equal → 返回 Ordering::Equal。
-
-
#[inline]: 提示編譯器內聯優化這些簡單函數。
三、用途
這段代碼的目的是將類型系統的信息(Greater/Equal/Less)轉換為運行時的 Ordering 值。典型場景可能是在泛型編程中,通過類型參數決定比較行為,例如:
fn compare<T: Ord>() -> Ordering {T::to_ordering()
}assert_eq!(compare::<Greater>(), Ordering::Greater);
四、關鍵點
-
標記類型(ZST): Greater/Equal/Less 是零運行時開銷的類型,僅用于編譯期邏輯。
-
密封模式: Ord: Sealed 確保只有當前 crate 能實現這個 trait,避免外部破壞一致性。
-
編譯期到運行時的轉換: 將類型信息轉換為運行時可用的 Ordering 值。
這種模式在類型級編程中很常見,例如在庫設計或 DSL 中利用類型系統表達邏輯。