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

【PhysUnits】15.13 SI类型级量纲(dimension.rs)

一、源码

这段代码实现了一个类型安全的物理单位系统,利用Rust的类型系统在编译时检查物理量的量纲正确性。

//! Physical Units Library with Type-Level Dimension Checking
//! 带类型级量纲检查的物理单位库
//!
//! This module provides type-safe physical unit representations using Rust's type system
//! to enforce dimensional correctness at compile time.
//! 本模块提供类型安全的物理单位表示,利用Rust类型系统在编译时强制量纲正确性
//!use crate::sealed::Sealed;
use crate::constant::{Integer, Sum, Diff, Prod};
use core::marker::PhantomData;
use core::ops::{Add, Sub, Mul, Div};use super::unitary::Unitary;/// Trait definitions for Dimension
/// 物理单位的Trait定义
/// Trait marking valid Dimension types
/// 标记有效单位类型的Trait
pub trait Dimensional: Sealed+Sized {
}impl<M: Integer, KG: Integer, S: Integer, A: Integer, K: Integer, MOL: Integer, CD: Integer>Sealed for Dimension<M, KG, S, A, K, MOL, CD>{
}impl<M: Integer, KG: Integer, S: Integer, A: Integer, K: Integer, MOL: Integer, CD: Integer>Dimensional for Dimension<M, KG, S, A, K, MOL, CD>{
}/// Fundamental structure representing physical units with dimensional exponents
/// 表示带有量纲指数的物理单位的基础结构
///
/// # Type Parameters | 类型参数
/// - `METER`: Length dimension exponent | 长度量纲指数
/// - `KILOGRAM`: Mass dimension exponent | 质量量纲指数  
/// - `SECOND`: Time dimension exponent | 时间量纲指数
/// - `AMPERE`: Current dimension exponent | 电流量纲指数
/// - `KELVIN`: Temperature dimension exponent | 温度量纲指数
/// - `MOLE`: Amount dimension exponent | 物质量量纲指数
/// - `CANDELA`: Luminous intensity dimension exponent | 光强量纲指数
///
/// # Example | 示例
/// ```
/// use crate::constant::Const;
/// use crate::Dimension;
/// 
/// // Represents m¹·s⁻¹ (velocity) | 表示 m¹·s⁻¹ (速度)
/// type VelocityUnit = Dimension<Const<1>, Const<0>, Const<1>, Const<0>, Const<0>, Const<0>, Const<0>>;
/// 
/// // Represents m·kg·s⁻² (force) | 表示 m·kg·s⁻² (力)
/// type ForceUnit = Dimension<Const<1>, Const<1>, Const<-2>, Const<0>, Const<0>, Const<0>,Const<0>>;
/// ```
#[derive(Debug, Clone, Copy)]
pub struct Dimension<METER: Integer,KILOGRAM: Integer,SECOND: Integer,AMPERE: Integer,KELVIN: Integer,MOLE: Integer,CANDELA: Integer
>(PhantomData<(METER, KILOGRAM, SECOND, AMPERE, KELVIN, MOLE, CANDELA)>
);impl<M: Integer, KG: Integer, S: Integer, A: Integer, K: Integer, MOL: Integer, CD: Integer>
Dimension<M, KG, S, A, K, MOL, CD> {/// Creates a new unit instance/// 创建新的单位实例pub fn new() -> Self {Self(PhantomData)}/// 将单位提升到幂次 `N`pub fn pow<N>(self) -> Dimension<Prod<M, N>,Prod<KG, N>,Prod<S, N>,Prod<A, N>,Prod<K, N>,Prod<MOL, N>,Prod<CD, N>,>whereN: Integer,M: Mul<N>,KG: Mul<N>,S: Mul<N>,A: Mul<N>,K: Mul<N>,MOL: Mul<N>,CD: Mul<N>,Prod<M, N>: Integer,Prod<KG, N>: Integer,Prod<S, N>: Integer,Prod<A, N>: Integer,Prod<K, N>: Integer,Prod<MOL, N>: Integer,Prod<CD, N>: Integer,{Dimension::new()}}// ========== Operator Implementations ==========
// ========== 运算符实现 ==========impl<M1, M2, KG1, KG2, S1, S2, A1, A2, K1, K2, MOL1, MOL2, CD1, CD2> Mul<Dimension<M2, KG2, S2, A2, K2, MOL2, CD2>> for Dimension<M1, KG1, S1, A1, K1, MOL1, CD1>
whereM1: Integer + Add<M2>,M2: Integer,KG1: Integer + Add<KG2>,KG2: Integer,S1: Integer + Add<S2>,S2: Integer,A1: Integer + Add<A2>,A2: Integer,K1: Integer + Add<K2>,K2: Integer,MOL1: Integer + Add<MOL2>,MOL2: Integer,CD1: Integer + Add<CD2>,CD2: Integer,Sum<M1, M2>: Integer,Sum<KG1, KG2>: Integer,Sum<S1, S2>: Integer,Sum<A1, A2>: Integer,Sum<K1, K2>: Integer,Sum<MOL1, MOL2>: Integer,Sum<CD1, CD2>: Integer,
{type Output = Dimension<Sum<M1, M2>, Sum<KG1, KG2>, Sum<S1, S2>,Sum<A1, A2>, Sum<K1, K2>, Sum<MOL1, MOL2>, Sum<CD1, CD2>>;/// Multiplies two units by adding their dimensional exponents/// 通过相加量纲指数来相乘两个单位fn mul(self, _: Dimension<M2, KG2, S2, A2, K2, MOL2, CD2>) -> Self::Output {Dimension::new()}
}impl<M1, M2, KG1, KG2, S1, S2, A1, A2, K1, K2, MOL1, MOL2, CD1, CD2> Div<Dimension<M2, KG2, S2, A2, K2, MOL2, CD2>> for Dimension<M1, KG1, S1, A1, K1, MOL1, CD1>
whereM1: Integer + Sub<M2>,M2: Integer,KG1: Integer + Sub<KG2>,KG2: Integer,S1: Integer + Sub<S2>,S2: Integer,A1: Integer + Sub<A2>,A2: Integer,K1: Integer + Sub<K2>,K2: Integer,MOL1: Integer + Sub<MOL2>,MOL2: Integer,CD1: Integer + Sub<CD2>,CD2: Integer,Diff<M1, M2>: Integer,Diff<KG1, KG2>: Integer,Diff<S1, S2>: Integer,Diff<A1, A2>: Integer,Diff<K1, K2>: Integer,Diff<MOL1, MOL2>: Integer,Diff<CD1, CD2>: Integer,
{type Output = Dimension<Diff<M1, M2>, Diff<KG1, KG2>, Diff<S1, S2>,Diff<A1, A2>, Diff<K1, K2>, Diff<MOL1, MOL2>, Diff<CD1, CD2>>;/// Divides two units by subtracting their dimensional exponents/// 通过相减量纲指数来相除两个单位fn div(self, _: Dimension<M2, KG2, S2, A2, K2, MOL2, CD2>) -> Self::Output {Dimension::new()}
}impl<L: Integer, M: Integer, T: Integer, I: Integer, Th: Integer, N: Integer, J: Integer>Unitary for Dimension<L, M, T, I, Th, N, J>{
}/// 量纲除法结果类型 / Dimension division result type
pub type DimensionDiv<A, B> = <A as Div<B>>::Output;/// 量纲乘法结果类型 / Dimension multiplication result type
pub type DimensionMul<A, B> = <A as Mul<B>>::Output;

二、核心概念

  1. 量纲检查:通过类型系统确保物理运算(如加减乘除)在量纲上是正确的,例如不能将长度与时间直接相加。

  2. 基本量纲:使用国际单位制(SI)的7个基本量纲:

  • 长度(METER)

  • 质量(KILOGRAM)

  • 时间(SECOND)

  • 电流(AMPERE)

  • 温度(KELVIN)

  • 物质的量(MOLE)

  • 发光强度(CANDELA)

三、主要结构

Dimension 结构体
pub struct Dimension<METER, KILOGRAM, SECOND, AMPERE, KELVIN, MOLE, CANDELA>

这个泛型结构体表示一个物理单位,其中每个类型参数代表对应基本量纲的指数(使用Integer trait约束)。

关键特性
  1. 类型级运算:
  • 乘法:对应量纲指数相加

  • 除法:对应量纲指数相减

  • 幂运算:所有量纲指数乘以幂次数

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

  2. 密封模式:通过Sealed trait防止外部实现

四、运算符实现

乘法实现
impl<...> Mul<Dimension<...>> for Dimension<...> {type Output = Dimension<Sum<...>, ...>;fn mul(...) -> Self::Output { ... }
}

乘法运算将两个单位的对应量纲指数相加,使用Sum类型表示结果。

除法实现
impl<...> Div<Dimension<...>> for Dimension<...> {type Output = Dimension<Diff<...>, ...>;fn div(...) -> Self::Output { ... }
}

除法运算将两个单位的对应量纲指数相减,使用Diff类型表示结果。

五、使用示例

// 速度单位 m¹·s⁻¹
type VelocityUnit = Dimension<Const<1>, Const<0>, Const<-1>, ...>;// 力单位 m·kg·s⁻²
type ForceUnit = Dimension<Const<1>, Const<1>, Const<-2>, ...>;

六、优势

  1. 编译时检查:所有量纲错误在编译时捕获

  2. 类型安全:防止不兼容单位的运算

  3. 零运行时开销:完全在类型系统层面实现

这个库适用于需要严格物理量纲检查的科学计算和工程应用场景。

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

相关文章:

  • 针对KG的神经符号集成综述 两篇
  • 企业级实战之Iptables防火墙案例分析
  • 11. 试学内容-如何理解隔离性2(原理)
  • mysql知识点
  • Axios学习笔记
  • 技术文档的降维打击:3大原则+5步结构+CSDN流量密码
  • 瀚文机械键盘固件开发详解:HWKeyboard.cpp文件解析与应用
  • linux 故障处置通用流程-36计+1计
  • 传输层协议 UDP 介绍 -- UDP 协议格式,UDP 的特点,UDP 的缓冲区
  • OPENCV的AT函数
  • 验证负载均衡与弹性伸缩
  • Nginx+Tomcat负载均衡与动静分离架构
  • 保险丝选型
  • Java基础原理与面试高频考点
  • 沉金PCB电路板制造有哪些操作要点需要注意?
  • 论文导读 | 区间数据管理
  • C#由于获取WPF窗口名称造成的异常报错问题
  • SQL 中 NOT IN 的陷阱?
  • 如何确定微服务的粒度与边界
  • 09.MySQL内外连接
  • 4. 数据类型
  • linux 安装 canal 的详细步骤
  • Linux I2C 子系统全解:结构、机制与工程实战
  • Hive开窗函数的进阶SQL案例
  • stm32使用hal库模拟spi模式3
  • git cherry-pick (28)
  • Redis初识
  • 华为ICT和AI智能应用
  • 深入理解系统:UML类图
  • YOLO12 改进|融入 Mamba 架构:插入视觉状态空间模块 VSS Block 的硬核升级