【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`)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/80134.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硬件实操技巧记录

本篇自用&#xff0c;防止自己忘记 焊接技巧 一般都是随机电烙铁锡膏组合。 拆电阻时&#xff0c;电烙铁放在电阻上&#xff0c;加锡膏&#xff0c;这个时候熔点会降低&#xff0c;电阻更容易掉下来&#xff0c;用电烙铁带走&#xff1b;焊电阻时&#xff0c;一端点锡膏&…

13.thinkphp的Session和cookie

一&#xff0e;Session 1. 在使用Session之前&#xff0c;需要开启初始化&#xff0c;在中间件文件middleware.php&#xff1b; // Session 初始化 \think\middleware\SessionInit::class 2. TP6.0不支持原生$_SESSION的获取方式&#xff0c;也不支持session_开头的函数&…

TensorFlow中数据集的创建

目录 前言示例示例1示例2示例3示例4 前言 TensorFlow 的 tf.data.Dataset API 提供了一种灵活且高效的方式来加载和预处理数据。它可以轻松处理大规模数据集&#xff0c;并支持多种数据源格式。 所有数据集相关的内容都在tf.data中&#xff0c;from_tensor_slices&#xff1a;…

第十六章,网络型攻击防范技术

网络攻击介绍 网络攻击 --- 指的是入侵或破坏网络上的服务器 ( 主机 ) &#xff0c;盗取服务器的敏感数据或占用网络带宽。 网络攻击分类&#xff1a; 流量型攻击 网络层攻击 应用层攻击 单包攻击 畸形报文攻击 --- 向目标主机发送有缺陷的IP报文&#xff0c;使得目标在…

服务器不备案有影响吗

在当今数字化的时代&#xff0c;服务器成为了众多企业和个人开展业务、展示自我的重要工具。然而&#xff0c;有一个问题常常被忽视&#xff0c;那就是服务器不备案到底有没有影响&#xff1f; 答案是肯定的&#xff01;服务器不备案&#xff0c;影响可不小。据相关数据显示&a…

【LeetCode Solutions】LeetCode 176 ~ 180 题解

CONTENTS LeetCode 176. 第二高的薪水&#xff08;SQL 中等&#xff09;LeetCode 177. 第 N 高的薪水&#xff08;SQL 中等&#xff09;LeetCode 178. 分数排名&#xff08;SQL 中等&#xff09;LeetCode 179. 最大数&#xff08;中等&#xff09;LeetCode 180. 连续出现的数字…

D720201 PCIE 转USB HUB

1. 启动时出现了下面错误 [ 4.682595] pcieport 0004:00:00.0: Signaling PME through PCIe PME interrupt [ 4.684939] pci 0004:01:00.0: Signaling PME through PCIe PME interrupt [ 4.691287] pci 0004:01:00.0: enabling device (0000 -> 0002) [ 5.2962…

【愚公系列】《Manus极简入门》028-创业规划顾问:“创业导航仪”

&#x1f31f;【技术大咖愚公搬代码&#xff1a;全栈专家的成长之路&#xff0c;你关注的宝藏博主在这里&#xff01;】&#x1f31f; &#x1f4e3;开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主&#xff01; &#x1f…

IBM BAW(原BPM升级版)使用教程第六讲

续前篇&#xff01; 一、事件&#xff1a;Undercover Agent 在 IBM Business Automation Workflow (BAW) 中&#xff0c;Undercover Agent (UCA) 是一个非常独特和强大的概念&#xff0c;旨在实现跨流程或系统的事件处理和触发机制。Undercover Agent 主要用于 事件驱动的流程…

【强化学习】动态规划(Dynamic Programming, DP)算法

1、动态规划算法解题 LeetCode 931. 下降路径最小和 给你一个 n x n 的 方形 整数数组 matrix &#xff0c;请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始&#xff0c;并从每一行中选择一个元素。在下一行选择的元素和当前行所选…

深入探索DSPy:开启模块化AI编程的新篇章

在当今快速发展的AI时代&#xff0c;语言模型&#xff08;LM&#xff09;的应用已经渗透到各个领域&#xff0c;从简单的文本生成到复杂的多模态任务&#xff0c;语言模型展现出了强大的能力。然而&#xff0c;随着应用场景的日益复杂&#xff0c;开发者们面临着一个共同的挑战…

List<T>中每次取固定长度的数据

工具类方法 package org.common.util; import java.util.ArrayList; import java.util.Iterator; import java.util.List;/*** 批处理取值组件* param <T>*/ public class BatchIterator<T> implements Iterator<List<T>> {private final List<T&g…

深入理解 Java 代理模式:从基础到实战​

在软件开发的世界里&#xff0c;设计模式是程序员智慧的结晶&#xff0c;它们为解决常见问题提供了经过验证的最佳实践。代理模式作为一种常用的结构型设计模式&#xff0c;在 Java 开发中有着广泛的应用。本文将深入探讨 Java 代理模式&#xff0c;从基本概念、分类、实现原理…

android-ndk开发(11): 安装 repo 命令

1. 长话短说 mkdir ~/soft/bin curl -L https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo chmod x repo~/.pathrc 添加: export PATH$PATH:~/soft/bin2. 短话长说 repo 的官方介绍页面&#xff1a; https://gerrit.googlesource.com/git-repo/ repo 的官方下载地…

45.传导发射整改摸底测试方法

传导发射整改摸底测试方法 1. 正式摸底预测试2. 简易方法预测试3. 分析频谱4. 探查传播路径5. 施加措施 1. 正式摸底预测试 去正式实验室做一次预测试&#xff0c;取得频谱图&#xff0c;确定超标频点和超标量&#xff08;备用&#xff09;。 2. 简易方法预测试 用小电流探头…

【漫话机器学习系列】249.Word2Vec自然语言训练模型

【自然语言处理】用 Word2Vec 将词语映射到向量空间详解 一、背景介绍 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;我们常常需要将文本信息转化为机器能够理解和处理的形式。传统的方法&#xff0c;如 one-hot编码&#xff0c;虽然简单&#xff0c;但存在严重…

支付宝 SEO 优化:提升小程序曝光与流量的完整指南

在拥有庞大用户基数的支付宝平台上&#xff0c;小程序已成为商家触达用户、提供服务的重要渠道。然而&#xff0c;随着平台上小程序数量的快速增长&#xff0c;如何在激烈的竞争中脱颖而出&#xff0c;获得更多的曝光和流量&#xff0c;成为每个开发者和运营者必须面对的关键挑…

20250509——TOPSIS计算各方案得分

目录 TOPSIS原理 算例分析 参考文献 逼近理想解排序法&#xff08;Technique for Order Preference by Similarity to an Ideal Solution, TOPSIS&#xff09;是一种多属性决策分析工具&#xff0c;其核心在于通过衡量备选方案与理想目标的接近程度实现科学排序。该方法首先…

【QT】项目打包与发布安装

文章目录 一、引言二、前期准备三、打包QT项目3.1 编译release版3.2 相关依赖打包3.3 打包发布3.4 安装 四、打包普通项目五、结束语 一、引言 当Qt程序编写完成通过IDE编译就可以得到对应的可执行程序&#xff0c;这个可执行程序在本地运行是完全没有问题的。因为在本地有Qt环…

提示词工程:通向AGI时代的人机交互艺术

‌引言&#xff1a;从基础到精通的提示词学习之旅‌ 欢迎来到 ‌"AGI时代核心技能"‌ 系列课程的第二模块——‌提示词工程‌。在这个模块中&#xff0c;我们将系统性地探索如何通过精心设计的提示词&#xff0c;释放大型语言模型的全部潜力&#xff0c;实现高效、精…