【PhysUnits】3.2 SI 量纲 补充幂运算(dimension/mod.rs)

发布于:2025-05-10 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、源码解析

这段代码定义了一个泛型结构体 Dimension 的方法 pow,用于将物理单位的维度提升到指定的幂次。

impl<M, KG, S, A, K, MOL, CD> Dimension<M, KG, S, A, K, MOL, CD>
where
    M: Integer,
    KG: Integer,
    S: Integer,
    A: Integer,
    K: Integer,
    MOL: Integer,
    CD: Integer,
{
    /// 将单位提升到幂次 `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>,
    >
    where
        N: 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()
    }
}
  1. 结构体定义
impl<M, KG, S, A, K, MOL, CD> Dimension<M, KG, S, A, K, MOL, CD>

这里为 Dimension 结构体实现了一个方法,该结构体有7个泛型参数:

  • M: 长度(米)的幂次

  • KG: 质量(千克)的幂次

  • S: 时间(秒)的幂次

  • A: 电流(安培)的幂次

  • K: 温度(开尔文)的幂次

  • MOL: 物质的量(摩尔)的幂次

  • CD: 发光强度(坎德拉)的幂次

  1. Trait约束
where
    M: Integer,
    KG: Integer,
    S: Integer,
    A: Integer,
    K: Integer,
    MOL: Integer,
    CD: Integer,
    ```
这些约束表示所有7个泛型参数都必须实现 Integer trait,表明它们代表的是整数幂次。

3. pow 方法
```rust
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>,
>

这个方法接受一个泛型参数 N(表示要提升的幂次),并返回一个新的 Dimension。

返回的 Dimension 的每个维度参数都是原始维度参数与 N 的乘积(使用 Prod 类型表示)。

  1. 方法约束
where
    N: 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,
  • N 必须实现 Integer trait(表示幂次是整数)。

  • 每个维度参数必须能够与 N 相乘(Mul trait)。

  • 乘积的结果(Prod<…, N>)必须仍然是 Integer 类型。

  1. 方法实现
{
    Dimension::new()
}

方法简单地创建并返回一个新的 Dimension 实例。实际的幂次计算是通过类型系统在编译时完成的(通过 Prod 类型)。

二、总结

这段代码实现了一个物理单位维度的幂运算。例如,如果有一个表示 m²·kg(长度平方乘以质量)的 Dimension,调用 .pow::()(平方)会返回一个表示 m⁴·kg² 的 Dimension。

关键点:
  • 使用类型系统在编译时进行维度计算

  • 所有操作都是零成本的,在运行时没有实际计算

  • 通过 trait 约束确保类型安全

  • Prod 是一个表示类型乘法的类型级运算符

这种模式常见于需要编译时计算和类型安全的领域,如物理量单位系统。


网站公告

今日签到

点亮在社区的每一天
去签到