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

【PhysUnits】3.3 SI 基础量纲单位(units/base.rs)

一、源码

这段代码定义了一系列基础物理量纲的类型别名,并使用标记 trait Canonical 来表示它们是国际单位制(SI)中的基本单位。

use crate::Dimension;
use typenum::{P1, Z0};/// 标记特质,表示基础量纲单位
pub trait Canonical {}/// Length (meter) / 长度 (米)
/// Length - meter (m) [L] = m¹
/// 长度 - 米 (m) [L] = m¹
pub type Meter = Dimension<P1, Z0, Z0, Z0, Z0, Z0, Z0>;
impl Canonical for Meter {}/// Mass (kilogram) / 质量 (千克)
/// Mass - kilogram (kg) [M] = kg¹
/// 质量 - 千克 (kg) [M] = kg¹
pub type Kilogram = Dimension<Z0, P1, Z0, Z0, Z0, Z0, Z0>;
impl Canonical for Kilogram {}/// Time (second) / 时间 (秒)
/// Time - second (s) [T] = s¹
/// 时间 - 秒 (s) [T] = s¹
pub type Second = Dimension<Z0, Z0, P1, Z0, Z0, Z0, Z0>;
impl Canonical for Second {}/// Electric current (ampere) / 电流 (安培)
/// Current - ampere (A) [I] = A¹
/// 电流 - 安培 (A) [I] = A¹
pub type Ampere = Dimension<Z0, Z0, Z0, P1, Z0, Z0, Z0>;
impl Canonical for Ampere {}/// Thermodynamic temperature (kelvin) / 热力学温度 (开尔文)
/// Temperature - kelvin (K) [Θ] = K¹
/// 温度 - 开尔文 (K) [Θ] = K¹
pub type Kelvin = Dimension<Z0, Z0, Z0, Z0, P1, Z0, Z0>;
impl Canonical for Kelvin {}/// Amount of substance (mole) / 物质的量 (摩尔)
/// Substance - mole (mol) [N] = mol¹
/// 物质的量 - 摩尔 (mol) [N] = mol¹
pub type Mole = Dimension<Z0, Z0, Z0, Z0, Z0, P1, Z0>;
impl Canonical for Mole {}/// Luminous intensity (candela) / 发光强度 (坎德拉)
/// Intensity - candela (cd) [J] = cd¹
/// 发光强度 - 坎德拉 (cd) [J] = cd¹
pub type Candela = Dimension<Z0, Z0, Z0, Z0, Z0, Z0, P1>;
impl Canonical for Candela {}
  1. 导入依赖
use crate::Dimension;
use typenum::{P1, Z0};
  • Dimension: 自定义的结构体,用于表示物理量纲(如长度、质量、时间等),有7个泛型参数,分别对应7个基本单位。

  • typenum: 一个Rust库,用于在类型级别表示数字和算术运算。

    • P1 表示正1(+1),Z0 表示零(0)。
  1. 标记 trait Canonical
pub trait Canonical {}
  • 这是一个空的 标记 trait,用于表示某个类型是 标准基础量纲单位(如 Meter、Kilogram 等)。

  • 它没有任何方法,仅用于编译时类型标记。

  1. 定义基础量纲类型
    代码定义了7种 国际单位制(SI)的基本单位,每个单位都是一个 Dimension 类型,并实现了 Canonical trait。

(1) 长度(米 / Meter)

pub type Meter = Dimension<P1, Z0, Z0, Z0, Z0, Z0, Z0>;
impl Canonical for Meter {}
  • 表示 长度(单位:米 m),其量纲为 [L] = m¹。

  • Dimension<P1, Z0, Z0, Z0, Z0, Z0, Z0> 表示:

    • 长度(M)的幂次 = P1(+1)

    • 其他量纲(质量、时间等)的幂次 = Z0(0)

(2) 质量(千克 / Kilogram)

pub type Kilogram = Dimension<Z0, P1, Z0, Z0, Z0, Z0, Z0>;
impl Canonical for Kilogram {}
  • 表示 质量(单位:千克 kg),量纲 [M] = kg¹。

  • Dimension<Z0, P1, Z0, Z0, Z0, Z0, Z0>:

    • 质量(KG)的幂次 = P1(+1)

    • 其他量纲的幂次 = Z0(0)

(3) 时间(秒 / Second)

pub type Second = Dimension<Z0, Z0, P1, Z0, Z0, Z0, Z0>;
impl Canonical for Second {}
  • 表示 时间(单位:秒 s),量纲 [T] = s¹。

  • Dimension<Z0, Z0, P1, Z0, Z0, Z0, Z0>:

    • 时间(S)的幂次 = P1(+1)

    • 其他量纲的幂次 = Z0(0)

(4) 电流(安培 / Ampere)

pub type Ampere = Dimension<Z0, Z0, Z0, P1, Z0, Z0, Z0>;
impl Canonical for Ampere {}
  • 表示 电流(单位:安培 A),量纲 [I] = A¹。

  • Dimension<Z0, Z0, Z0, P1, Z0, Z0, Z0>:

    • 电流(A)的幂次 = P1(+1)

    • 其他量纲的幂次 = Z0(0)

(5) 温度(开尔文 / Kelvin)

pub type Kelvin = Dimension<Z0, Z0, Z0, Z0, P1, Z0, Z0>;
impl Canonical for Kelvin {}
  • 表示 温度(单位:开尔文 K),量纲 [Θ] = K¹。

  • Dimension<Z0, Z0, Z0, Z0, P1, Z0, Z0>:

    • 温度(K)的幂次 = P1(+1)

    • 其他量纲的幂次 = Z0(0)

(6) 物质的量(摩尔 / Mole)

pub type Mole = Dimension<Z0, Z0, Z0, Z0, Z0, P1, Z0>;
impl Canonical for Mole {}
  • 表示 物质的量(单位:摩尔 mol),量纲 [N] = mol¹。

  • Dimension<Z0, Z0, Z0, Z0, Z0, P1, Z0>:

    • 物质的量(MOL)的幂次 = P1(+1)

    • 其他量纲的幂次 = Z0(0)

(7) 发光强度(坎德拉 / Candela)

pub type Candela = Dimension<Z0, Z0, Z0, Z0, Z0, Z0, P1>;
impl Canonical for Candela {}
  • 表示 发光强度(单位:坎德拉 cd),量纲 [J] = cd¹。

  • Dimension<Z0, Z0, Z0, Z0, Z0, Z0, P1>:

    • 发光强度(CD)的幂次 = P1(+1)

    • 其他量纲的幂次 = Z0(0)

二、总结

这段代码的核心思想是:

  1. 使用 Dimension 泛型结构体 表示物理量纲,7个泛型参数分别对应7个基本单位。

  2. 使用 typenum 在类型级别表示幂次:

  • P1 表示 +1(单位的基本幂次)。

  • Z0 表示 0(该单位不出现)。

  1. 用 Canonical trait 标记基础单位,便于类型系统识别。

三、示例

  • Meter 表示 m¹(长度单位,幂次 +1)。

  • Kilogram 表示 kg¹(质量单位,幂次 +1)。

  • 其他单位类似。

四、用途

这种设计常用于 类型安全的物理计算库(如 uom 或 dimensioned),可以在编译时检查单位是否正确,避免运行时错误。例如:

let length: Meter = 5.0; // 5 米
let mass: Kilogram = 10.0; // 10 千克
let speed = length / mass; // 编译错误!因为 `m / kg` 不是标准速度单位(应该是 `m / s`)

这样,编译器可以防止单位不匹配的错误,提高代码的可靠性。

相关文章:

  • Leetcode刷题 由浅入深之字符串——541. 反转字符串Ⅱ
  • 振动临近失效状态,怎么频谱会是梳子?
  • API请求参数有哪些?
  • Modbus RTU 详解 + FreeMODBUS移植(附项目源码)
  • 【算法】:滑动窗口
  • 常见图像融合算法(alpha和金字塔融合)
  • 使用智能表格做FMEDA
  • Mysql--基础知识点--91.1--慢查询日志
  • 日常知识点之随手问题整理(思考单播,组播,广播哪个更省带宽)
  • RocketMQ 深度解析:架构设计与最佳实践
  • 学习黑客认识数字取证与事件响应(DFIR)
  • 修改docker为国内源
  • 【笔记】BCEWithLogitsLoss
  • NVME / DoCA 是什么?
  • 2025年 全新 AI 编程工具 Cursor 安装使用教程
  • 【RAG官方大神笔记】检索增强生成 (RAG):Python AI 教程的详细介绍
  • FastChat部署大模型
  • tauri-plugin-store 这个插件将数据存在本地电脑哪个位置
  • 如何把win10 wsl的安装目录从c盘迁移到d盘
  • postgresql 参数wal_level
  • 跨越时空的“精神返乡”,叶灵凤藏书票捐赠上海文学馆
  • 印度一战机在巴基斯坦旁遮普省被击落,飞行员被俘
  • 上海第四批土拍成交额97亿元:杨浦宅地成交楼板单价半年涨近7000元
  • 洛杉矶奥组委确认2028年奥运会和残奥会开闭幕式场地
  • 商务部再回应中美经贸高层会谈
  • 美政府被曝下令加强对格陵兰岛间谍活动,丹麦将召见美代办