一、源码
这段代码是用 Rust 语言实现的一个类型系统,用于表示和处理特定的整数类型。
use crate::number::{Null, O, I, B, TInt, Bit};
// ==========NonZeroNonMinusOne 实现 ==========
/// 非零非负一整数的标记特质,已经剔除了不规范格式
pub trait NonZeroNonMinusOne: TInt {}
impl NonZeroNonMinusOne for B<B<Null, O>, I> {} // 1
impl NonZeroNonMinusOne for B<B<Null, I>, O> {} // -2
impl<H: NonZeroNonMinusOne, L: Bit>NonZeroNonMinusOne for B<H, L> {}
二、源码分析
- 导入依赖
use crate::number::{Null, O, I, B, TInt, Bit};
这行代码从当前 crate 的 number 模块中导入了一些类型和特质(trait),包括:
Null, O, I, B: 这些是表示二进制数字和结构的类型
TInt, Bit: 特质(trait),分别表示整数类型和位(bit)类型
- NonZeroNonMinusOne 特质
pub trait NonZeroNonMinusOne: TInt {}
定义了一个公共特质 NonZeroNonMinusOne,它表示"非零非负一"的整数类型。任何实现这个特质的类型都必须先实现 TInt 特质。
3. 特质实现
接下来是对 NonZeroNonMinusOne 的具体实现:
a. 第一种实现
impl NonZeroNonMinusOne for B<B<Null, O>, I> {} // 1
这表示类型 B<B<Null, O>, I> 实现了 NonZeroNonMinusOne 特质。注释 // 1 表明这个类型代表数字 1。
b. 第二种实现
impl NonZeroNonMinusOne for B<B<Null, I>, O> {} // -2
这表示类型 B<B<Null, I>, O> 实现了 NonZeroNonMinusOne 特质,代表数字 -2。
c. 泛型实现
impl<H: NonZeroNonMinusOne, L: Bit> NonZeroNonMinusOne for B<H, L> {}
这是一个泛型实现,表示对于任何:
H 类型:实现了 NonZeroNonMinusOne
L 类型:实现了 Bit
的组合 B<H, L> 都实现了 NonZeroNonMinusOne 特质。
- 类型系统设计
这段代码展示了一个用类型系统表示数字的设计:
使用 B 类型构造二进制表示的数字
Null 是泛型嵌套结束标识,表示该位为空
O 和 I 分别表示二进制位的 0 和 1
通过嵌套的 B 类型构造更长的二进制数
- 目的
这个特质和实现的主要目的是:
定义一个表示"非零且不等于-1"的整数类型的标记特质
确保这些类型有正确的二进制表示形式
通过类型系统在编译期保证数值的合法性
该特质是根据构建类型级整数的特点标记的基本数类型,整型、非零整型等标记可以在此基础上扩展
这种设计常见于依赖类型系统或类型级编程的场景,可以在编译期捕获某些数值错误。