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

【PhysUnits】15.18 Unit基础结构 (unit.rs)

一、源码
这段代码定义了一个用于表示物理单位的通用结构Unit,支持单位的自动推导和运算。

//! Unit基础结构
//! 
//! 支持单位自动推导use crate::sealed::Sealed;
use core::marker::PhantomData;
use core::ops::{Add, Sub, Mul, Div};
use crate::constant::{Sum, Diff};
use super::Sied;
use super::ratio::Scaled;
use super::Unitary;/// Unit基础结构
/// 
/// # 类型参数
/// - `R`: 比例因子类型
/// - `S`: SI基础类型
#[derive(Debug, Clone, Copy)]
pub struct Unit<R: Scaled, S: Sied>(PhantomData<(R, S)>);impl<R: Scaled, S: Sied> Unit<R, S>{pub fn new() -> Self {Self(PhantomData)}
}impl<R: Scaled, S: Sied> Sealed for Unit<R, S>{}impl<R: Scaled, S: Sied> Unitary for Unit<R, S>{}// ================ 运算实现 ================impl<R1, R2, D1:Sied, D2:Sied> Mul<Unit<R2, D2>> for Unit<R1, D1>
whereR1: Scaled + Add<R2>,R2: Scaled,D1: Mul<D2>,  // 使用标准乘法 traitSum<R1, R2>: Scaled, <D1 as Mul<D2>>::Output: Sied,
{type Output = Unit<Sum<R1, R2>, <D1 as Mul<D2>>::Output  // 单位相乘>;/// 物理量乘法fn mul(self, _rhs: Unit<R2, D2>) -> Self::Output {Unit(PhantomData)}
}impl<R1, R2, D1:Sied, D2:Sied> Div<Unit<R2, D2>> for Unit<R1, D1>
whereR1: Scaled + Sub<R2>,  R2: Scaled,D1: Div<D2>,Diff<R1, R2>: Scaled,<D1 as Div<D2>>::Output: Sied,
{type Output = Unit<Diff<R1, R2>,  // 相减<D1 as Div<D2>>::Output>;/// 物理量除法fn div(self, _rhs: Unit<R2, D2>) -> Self::Output {Unit(PhantomData)}
}

二、基本结构

pub struct Unit<R: Scaled, S: Sied>(PhantomData<(R, S)>);
  • Unit是一个泛型结构体,使用PhantomData来持有类型参数而不实际占用空间

  • 类型参数:

    • R: Scaled:比例因子类型,表示单位的缩放比例(如千米是米的1000倍)

    • S: Sied:SI基础类型,表示国际单位制中的基本单位(如米、秒、千克等)

三、核心特性

  1. 构造与标记:
  • new()方法创建一个新的Unit实例

  • 实现了Sealed和Unitary trait,表明这是一个单位类型

  1. 单位乘法:
impl<R1, R2, D1, D2> Mul<Unit<R2, D2>> for Unit<R1, D1>
  • 当两个单位相乘时:

  • 比例因子R1和R2相加(Sum<R1, R2>)

  • SI基础类型D1和D2相乘(D1::Output)

  • 例如:米(1, Length) × 千米(1000, Length) = 1000米²

  1. 单位除法:
impl<R1, R2, D1, D2> Div<Unit<R2, D2>> for Unit<R1, D1>
  • 当两个单位相除时:

    • 比例因子R1和R2相减(Diff<R1, R2>)

    • SI基础类型D1和D2相除(D1::Output)

  • 例如:千米(1000, Length) ÷ 秒(1, Time) = 1000米/秒

四、设计特点

  1. 零成本抽象:使用PhantomData确保运行时无额外开销

  2. 类型安全:通过类型系统保证单位运算的正确性

  3. 自动推导:运算结果类型由编译器自动推导

  4. 组合性:支持复杂单位的组合运算

五、使用场景

这种设计常用于需要严格单位检查的物理计算库,可以防止如"1米 + 1秒"这样的类型错误,并在编译期完成单位换算和简化。

整个实现利用了Rust的类型系统和trait机制,在编译期完成单位运算的类型检查,确保物理计算的维度正确性。

相关文章:

  • 好未来0520上机考试题1:括号的最大嵌入深度
  • 【PCIe总线】 -- PCI、PCIe相关实现
  • 【Dv3Admin】系统视图下载中心API文件解析
  • 【leetcode】递归,回溯思想 + 巧妙解法-解决“N皇后”,以及“解数独”题目
  • 从零开始制作小程序简单概述
  • C++设计模式 - 单例模式
  • 硬件电路设计-开关电源设计
  • 第22讲、Odoo18 QWeb 模板引擎详解
  • day49 python 注意力热图
  • 银行卡二三四要素实名接口如何用PHP实现调用?
  • 抖去推--短视频矩阵系统源码开发
  • 十(1). 强制类型转换
  • 【C/C++】实现固定地址函数调用
  • OSCP靶机练习 mantis
  • FlashAttention 公式推导
  • OD 算法题 B卷【全排列】
  • Supersonic 新一代AI数据分析平台
  • JS有哪些迭代器,该如何使用?
  • 【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
  • vue中的派发事件与广播事件,及广播事件应用于哪些场景和一个表单验证例子
  • 企业网站诊断与优化方案/信息流优化师发展前景
  • 网站开发运用的技术/编程培训机构排名前十
  • 网站开发ceac证/网站流量统计分析工具
  • 页面设计软件教程/网站如何seo推广
  • 做一个电商网站多少钱/高质量内容的重要性
  • 中山网站建设公司/定制网站建设