一、源码
这段代码定义了一个标记特征(marker trait)NonZero,用于表示非零整数类型,并通过实现规则确保只有符合条件的类型才能实现该特征。
rust
use crate::number::{Null, I, B, TInt, NonZeroNonMinusOne};
// ==========NonZero 实现 ==========
/// 非零整数的标记特质,已经剔除了不规范格式
pub trait NonZero: TInt {}
impl<X: NonZeroNonMinusOne> NonZero for X {}
impl NonZero for B<Null, I> {}
二、代码分析
- 导入和特征定义
rust
use crate::number::{Null, I, B, TInt, NonZeroNonMinusOne};
pub trait NonZero: TInt {}
-
导入的类型:
-
Null, I, B: 是表示二进制位数字的标记类型。
-
TInt: 标记特征,表示"类型级整数类型"。
-
NonZeroNonMinusOne: 另一个标记特征,表示"既非零也非 -1 的整数"。
-
-
NonZero trait:
-
是一个空 trait(无方法),仅用于标记"非零整数"类型。
-
继承 TInt,表示所有 NonZero 类型必须首先是整数类型(TInt)。
-
- 实现规则
rust
impl<X: NonZeroNonMinusOne> NonZero for X {}
impl NonZero for B<Null, I> {}
-
第一条实现:
-
为所有满足 X: NonZeroNonMinusOne 的泛型类型 X 实现 NonZero。
-
即:如果某个类型是"既非零也非 -1 的整数"(NonZeroNonMinusOne),则自动标记为 NonZero。
-
-
第二条实现:
- 为特定类型 B<Null, I> 直接实现 NonZero。
- 这里 B<Null, I> 为补码形式,表示-1。
三、设计意图
- 标记非零类型:
- 通过 NonZero trait,类型系统可以区分"可能为零的整数"和"绝对非零的整数"。
- 类似 Rust 标准库中的 std::num::NonZero* 类型(如 NonZeroU8),用于优化内存布局或避免运行时检查。
- 限制实现范围:
-
通过 NonZero: TInt 和具体实现规则,确保只有符合条件的类型才能标记为 NonZero。
-
例如,NonZeroNonMinusOne 类型和 B<Null, I> 是明确安全的非零类型。
- 扩展性:
- 通过泛型实现(impl<X: NonZeroNonMinusOne>),未来新增的"非零非 -1"类型会自动实现 NonZero。
四、示例场景
假设 NonZero 用于除法校验分母:
rust
fn safe_divide<N: TInt, D: NonZero>(numerator: N, denominator: D) -> N {
numerator / denominator.into() // 编译器保证分母非零
}
- 只有标记为 NonZero 的类型才能作为分母,避免运行时零除检查。
五、关键点
-
零成本抽象:标记 trait 在编译期被擦除,无运行时开销。
-
类型安全:通过 trait 约束在编译期排除非法操作(如除零)。
-
组合性:NonZero 可与其他 trait(如 TInt)组合表达更复杂的约束。