【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 {}
- 导入依赖
use crate::Dimension;
use typenum::{P1, Z0};
-
Dimension: 自定义的结构体,用于表示物理量纲(如长度、质量、时间等),有7个泛型参数,分别对应7个基本单位。
-
typenum: 一个Rust库,用于在类型级别表示数字和算术运算。
- P1 表示正1(+1),Z0 表示零(0)。
- 标记 trait Canonical
pub trait Canonical {}
-
这是一个空的 标记 trait,用于表示某个类型是 标准基础量纲单位(如 Meter、Kilogram 等)。
-
它没有任何方法,仅用于编译时类型标记。
- 定义基础量纲类型
代码定义了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)
-
二、总结
这段代码的核心思想是:
-
使用 Dimension 泛型结构体 表示物理量纲,7个泛型参数分别对应7个基本单位。
-
使用 typenum 在类型级别表示幂次:
-
P1 表示 +1(单位的基本幂次)。
-
Z0 表示 0(该单位不出现)。
- 用 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`)
这样,编译器可以防止单位不匹配的错误,提高代码的可靠性。