一、源码
这段代码定义了一个标记特征(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 中利用类型系统表达逻辑。