当前位置: 首页 > ds >正文

【typenum】 16 非零标记及改进建议

一、源码

这段代码定义了一个标记 trait NonZero,用于在类型系统中表示"非零"的数值类型。这是 Rust 类型级编程(type-level programming)的典型模式,常见于类型算术(type-level arithmetic)库中。

  1. 定义
/// A **marker trait** to designate that a type is not zero. All number types in this
/// crate implement `NonZero` except `B0`, `U0`, and `Z0`.
pub trait NonZero: Sealed {}
  1. B1实现(bit.rs)
impl NonZero for B1 {}
  1. UInt实现(uint.rs)
impl<U: Unsigned, B: Bit> NonZero for UInt<U, B> {}
  1. PInt、NInt实现(int.rs)
impl<U: Unsigned + NonZero> NonZero for PInt<U> {}
impl<U: Unsigned + NonZero> NonZero for NInt<U> {}

二、核心定义 (marker_traits.rs)


pub trait NonZero: Sealed {}
  • 标记 trait:没有方法或关联类型,仅用于类型分类

  • 作用:标识该类型代表非零值

  • Sealed:这是一个密封 trait,防止外部类型实现

  • 注释说明:除了 B0、U0 和 Z0 外,所有数值类型都实现此 trait

三、各类型实现

  1. 位类型实现 (bit.rs)

impl NonZero for B1 {}
  • B1 表示二进制位 1

  • 只有 B1 实现 NonZero,B0 不实现(符合"非零"定义)

  1. 无符号整数实现 (uint.rs)

impl<U: Unsigned, B: Bit> NonZero for UInt<U, B> {}
  • UInt<U, B> 是类型级无符号整数的通用结构

  • 任何由 Unsigned 类型 U 和位 B 组成的 UInt 都自动是非零

  • 注意:UInt<UTerm, B0>(即 U0)不实现此 trait

  1. 有符号整数实现 (int.rs)

impl<U: Unsigned + NonZero> NonZero for PInt<U> {}  // 正整数
impl<U: Unsigned + NonZero> NonZero for NInt<U> {}  // 负整数
  • PInt 表示正整数,NInt 表示负整数

  • 只有当底层无符号类型 U 是 NonZero 时,它们才是 NonZero

  • 例如:

    • PInt 是 NonZero(因为 U1 是 NonZero)

    • PInt 不是 NonZero(因为 U0 不是 NonZero)

四、设计意义

  1. 类型安全:

fn divide<T: NonZero>(numerator: i32, _denominator: T) -> i32 {numerator / unsafe { std::mem::transmute::<T, i32>(_denominator) }
}

保证除数永远不会是零

  1. 编译时验证:
trait SafeDivision {type Output;}impl<T: NonZero> SafeDivision for T {type Output = Self;}
  1. 与零类型互补:
  • Zero trait 和 NonZero trait 共同覆盖所有数值类型

  • 通过 trait 约束可以明确区分零/非零场景

五、典型使用场景

  1. 类型级算术运算:

fn generic_fn<T: NonZero>() {// 保证T不是零类型
}
  1. 安全数学运算:
struct Ratio<N, D: NonZero> {numerator: N,denominator: D,}
硬件寄存器操作(确保不写零值到特定寄存器)

这种模式在需要编译时保证数值属性的场景非常有用,特别是嵌入式开发、密码学、区块链等对安全性要求高的领域。

六、改进建议

  1. 正整数类型改名
原类型新命名数学含义扩展性设计
UInt<U,B>UPos<U,B>二进制无符号正整数 (2*U + B)保留U前缀与无符号体系一致
PIntSPos有符号正整数S前缀(Signed)为小数/浮点数预留
  1. 负整数类型改名
原类型新命名数学含义扩展性设计
NIntSNeg有符号负整数明确负号语义,支持后续小数/浮点数实现
  1. 扩展预留设计

/// 有符号类型标记(为小数预留)
pub trait Sign {const IS_POSITIVE: bool;
}impl<U: Unsigned> Sign for SPos<U> {const IS_POSITIVE: bool = true;
}impl<U: Unsigned> Sign for SNeg<U> {const IS_POSITIVE: bool = false;
}/// 未来可扩展的小数类型
pub struct SFrac<U: Unsigned, S: Sign> { /*...*/ }
http://www.xdnf.cn/news/18210.html

相关文章:

  • 【Linux系统】动静态库的制作
  • java之 junit4单元测试Mockito的使用
  • Pycharm Debug详解
  • 深度学习之优化器
  • 数据与模型融合波士顿房价回归建模预测
  • 数据结构(排序篇)——七大排序算法奇幻之旅:从扑克牌到百亿数据的魔法整理术
  • LeetCode 1323: 6和9组成的最大数字
  • 内网后渗透攻击--隐藏通信隧道技术(应用层隧道技术)
  • 一键管理 StarRocks:简化集群的启动、停止与状态查看
  • JAVA后端开发——Token自动续期机制的必要性
  • 库制作与原理(下)
  • RabbitMQ面试精讲 Day 24:消费者限流与批量处理
  • Linux中iSCSI存储配置与管理指南
  • Leetcode 15 java
  • 【LeetCode 热题 100】118. 杨辉三角
  • 使用Github Page发布网站
  • Compose笔记(四十六)--Popup
  • 廖雪峰-java教程-Part01
  • RK3588开发板Ubuntu系统烧录
  • 如何利用gemini-cli快速了解一个项目以及学习新的组件?
  • GitHub Copilot:AI编程助手的架构演进与真实世界影响
  • 【102页PPT】新一代数字化转型信息化总体规划方案(附下载方式)
  • 第七十九:AI的“急诊科医生”:模型失效(Loss Explode)的排查技巧——从“炸弹”到“稳定”的训练之路!
  • 为什么神经网络在长时间训练过程中会存在稠密特征图退化的问题
  • AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年8月17日第163弹
  • 内网穿透系列十一:NPS 是一款轻量级、高性能、功能强大的内网穿透工具,自带Web管理端,支持Docker快速部署
  • Win10快速安装.NET3.5
  • Web全栈项目中健康检查API的作用(现代云原生应用标准实践)(health check、healthcheck、livenessProbe、健康探针)
  • 博士招生 | 香港大学 机器增强认知实验室 招收博士生/实习生/访问学生
  • File 类的用法和 InputStream, OutputStream 的用法