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

【unitrix】 6.20 非零整数特质(non_zero.rs)

一、源码

这段代码定义了一个标记特征(marker trait)NonZero,用于表示非零整数类型,并通过实现规则确保只有符合条件的类型才能实现该特征。

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> {}

二、代码分析

  1. 导入和特征定义

use crate::number::{Null, I, B, TInt, NonZeroNonMinusOne};pub trait NonZero: TInt {}
  • 导入的类型:

    • Null, I, B: 是表示二进制位数字的标记类型。

    • TInt: 标记特征,表示“类型级整数类型”。

    • NonZeroNonMinusOne: 另一个标记特征,表示“既非零也非 -1 的整数”。

  • NonZero trait:

    • 是一个空 trait(无方法),仅用于标记“非零整数”类型。

    • 继承 TInt,表示所有 NonZero 类型必须首先是整数类型(TInt)。

  1. 实现规则

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。

三、设计意图

  1. 标记非零类型:
  • 通过 NonZero trait,类型系统可以区分“可能为零的整数”和“绝对非零的整数”。
  • 类似 Rust 标准库中的 std::num::NonZero* 类型(如 NonZeroU8),用于优化内存布局或避免运行时检查。
  1. 限制实现范围:
  • 通过 NonZero: TInt 和具体实现规则,确保只有符合条件的类型才能标记为 NonZero。

  • 例如,NonZeroNonMinusOne 类型和 B<Null, I> 是明确安全的非零类型。

  1. 扩展性:
  • 通过泛型实现(impl<X: NonZeroNonMinusOne>),未来新增的“非零非 -1”类型会自动实现 NonZero。

四、示例场景

假设 NonZero 用于除法校验分母:


fn safe_divide<N: TInt, D: NonZero>(numerator: N, denominator: D) -> N {numerator / denominator.into() // 编译器保证分母非零
}
  • 只有标记为 NonZero 的类型才能作为分母,避免运行时零除检查。

五、关键点

  • 零成本抽象:标记 trait 在编译期被擦除,无运行时开销。

  • 类型安全:通过 trait 约束在编译期排除非法操作(如除零)。

  • 组合性:NonZero 可与其他 trait(如 TInt)组合表达更复杂的约束。

http://www.dtcms.com/a/301987.html

相关文章:

  • 做了一款小而美的本地校验器
  • 【保姆级喂饭教程】Python依赖管理工具大全:Virtualenv、venv、Pipenv、Poetry、pdm、Rye、UV、Conda、Pixi等
  • 【el-table滚动事件】el-table表格滚动时,获取可视窗口内的行数据
  • 电磁兼容五:仿真技术
  • 数智驱动的「库存管理」:从风险系数、ABC分类到OMS和ERP系统的协同优化策略
  • 前端静态资源优化
  • WD5030A芯片24降12V,15A以内,应用于路由器、交换机和网络服务器,成本低大电流
  • 枚举策略模式实战:优雅消除支付场景的if-else
  • 6种将iPhone照片传输到Windows 10电脑的方法
  • Vue 正在热映模块
  • 安宝特案例丨AR+AI+SOP?3大技术融合革新军工航天领域
  • 组件化(一):重新思考“组件”:状态、视图和逻辑的“最佳”分离实践
  • 中兴云电脑W101D2-晶晨S905L3A-2G+8G-安卓9-线刷固件包
  • react前端样式如何给元素设置高度自适应
  • 四、计算机组成原理——第7章:输入/输出系统
  • Mac查看本机ip地址
  • 六轴机械臂cad【11张】三维图+设计说明书
  • GPU训练日志 (下)
  • Redis 服务挂掉排查与解决
  • STL学习(?、set容器)
  • 计算机毕业设计java在线二手系统的设计与实现 基于Java的在线二手交易平台开发 Java技术驱动的二手物品管理系统
  • 如何创建 Google 翻译桌面快捷方式
  • qt 心跳包
  • 【Linux篇】进程间通信:进程IPC
  • 搜索引擎高级搜索指令大全(Google、百度等浏览器通用)
  • R语言简介(附电子书资料)
  • 【kafka】消息队列
  • 深入Go并发编程:Channel、Goroutine与Select的协同艺术
  • Java BigDecimal详解:小数精确计算、使用方法与常见问题解决方案
  • 生产力效能跃升 金士顿DDR5 5600内存