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

【typenum】 19 类型相同检查(type_operators.rs片段)

一、源码

代码定义了一个 Rust trait Same,用于在类型系统中检查两个类型是否相同。

/// A **type operator** that ensures that `Rhs` is the same as `Self`, it is mainly useful
/// for writing macros that can take arbitrary binary or unary operators.
///
/// `Same` is implemented generically for all types; it should never need to be implemented
/// for anything else.
///
/// Note that Rust lazily evaluates types, so this will only fail for two different types if
/// the `Output` is used.
///
/// # Example
/// ```rust
/// use typenum::{Same, Unsigned, U4, U5};
///
/// assert_eq!(<U5 as Same<U5>>::Output::to_u32(), 5);
///
/// // Only an error if we use it:
/// # #[allow(dead_code)]
/// type Undefined = <U5 as Same<U4>>::Output;
/// // Compiler error:
/// // Undefined::to_u32();
/// ```
pub trait Same<Rhs = Self> {/// Should always be `Self`type Output;
}impl<T> Same<T> for T {type Output = T;
}

二、核心功能

类型相等检查:Same 确保当前类型(Self)与 Rhs 类型相同

三、代码结构

  1. Trait 定义

pub trait Same<Rhs = Self> {type Output;
}
  • Rhs = Self:默认泛型参数,使得 Same 可以不带参数使用

  • Output:关联类型,用于返回结果

  1. 实现

impl<T> Same<T> for T {type Output = T;
}
  • 为所有类型 T 实现 Same

  • 当 Self 和 Rhs 都是 T 时,Output 就是 T

五、工作原理

编译时类型检查


// ✅ 编译通过:U5 和 U5 类型相同
<U5 as Same<U5>>::Output  // 返回 U5// ❌ 编译错误:U5 和 U4 类型不同(仅在访问 Output 时报错)
<U5 as Same<U4>>::Output  // 编译错误

六、惰性求值特性

Rust 只在真正使用 Output 时才进行类型检查,这使得:

  • 定义类型别名不会立即报错

  • 只有在实际使用时才会触发编译错误

七、实际用途

  1. 宏编程

// 在宏中可以统一处理运算符,由 Same trait 确保类型安全
macro_rules! safe_operation {($lhs:ty, $op:ty, $rhs:ty) => {<$lhs as Same<$rhs>>::Output}
}

八、类型约束

可以作为其他 trait 的约束,确保操作数类型相同:
···rust

trait SafeAdd: Same {
type Sum;
}
···

九、总结

这是一个零开销的编译时类型检查工具:

  • ✅ 运行时无性能损耗

  • ✅ 编译时类型安全

  • ✅ 支持泛型编程和宏扩展

  • ✅ 利用 Rust 的 trait 系统和惰性求值特性

主要用于构建类型安全的领域特定语言(DSL)和高级类型系统操作。

http://www.xdnf.cn/news/18371.html

相关文章:

  • JavaWeb前端03(Ajax概念及在前端开发时应用)
  • SD 节点学习
  • ZStack Zaku替代VMware Tanzu:六项对比、构建虚拟机+容器一体化架构
  • HTTP 403 错误:后端权限校验机制深度解析
  • Matplotlib数据可视化实战:Matplotlib高级使用技巧与性能优化
  • 用OpencvSharp编写视频录制工具
  • Matplotlib数据可视化实战:Matplotlib数据可视化入门与实践
  • 【Android】悬浮窗清理
  • Pytorch基础学习--张量(生成,索引,变形)
  • 从系统漏洞归零到候诊缩短20%:一个信创样本的效能革命
  • 机器学习聚类与集成算法全解析:从 K-Means 到随机森林的实战指南
  • CRMEB私域电商系统后台开发实战:小程序配置全流程解析
  • 贪吃蛇游戏(纯HTML)
  • 什么是区块链?从比特币到Web3的演进
  • 图像中物体计数:基于YOLOv5的目标检测与分割技术
  • 十分钟速通堆叠
  • 智慧城市SaaS平台/市政设施运行监测系统之空气质量监测系统、VOC气体监测系统、污水水质监测系统及环卫车辆定位调度系统架构内容
  • 终结开发混乱,用 Amazon Q 打造AI助手
  • 华为云ModelArts+Dify AI:双剑合璧使能AI应用敏捷开发
  • CSS【详解】性能优化
  • 【知识储备】PyTorch / TensorFlow 和张量的联系
  • 数字货币发展存在的问题:交易平台的问题不断,但监管日益加强
  • React + Antd+TS 动态表单容器组件技术解析与实现
  • Linux -- 封装一个线程池
  • 射频电路的完整性简略
  • ubuntu编译ijkplayer版本k0.8.8(ffmpeg4.0)
  • JVM-(7)堆内存逻辑分区
  • 智能编程中的智能体与 AI 应用:概念、架构与实践场景
  • 【Flutter】Container设置对齐方式会填满父组件剩余空间
  • BaaS(Backend as a Service)技术深度解析:云时代的后端开发革命