32 个版本 (重大变更)
| 0.36.0 | 2024 年 3 月 21 日 |
|---|---|
| 0.35.0 | 2023 年 7 月 10 日 |
| 0.34.0 | 2023 年 2 月 10 日 |
| 0.33.0 | 2022 年 6 月 28 日 |
| 0.11.0 | 2017 年 2 月 26 日 |
#1 in #units
84,435 每月下载量
在 130 个crate中(62个直接使用)
1MB
15K SLoC
uom
计量单位是一个用于自动类型安全零成本的维度分析crate。您可以创建自己的系统或使用预构建的基于国际单位制(SI),该单位制基于国际量度系统(ISQ)并包含许多量度(长度、质量、时间等)以及用于更多量度单位(米、千米、英尺、英里等)的转换因子。不再让你的气候轨道器崩溃!
用法
uom 需要 rustc 1.65.0 或更高版本。将其添加到您的 Cargo.toml
[dependencies]
uom = "0.36.0"
并添加到您的 crate 根目录
extern crate uom;
以下简单示例展示了如何使用量度和单位,以及如何使用 uom 阻止无效操作
extern crate uom;
use uom::si::f32::*;
use uom::si::length::kilometer;
use uom::si::time::second;
fn main() {
let length = Length::new::<kilometer>(5.0);
let time = Time::new::<second>(15.0);
let velocity/*: Velocity*/ = length / time;
let _acceleration = calc_acceleration(velocity, time);
//let error = length + time; // error[E0308]: mismatched types
// Get a quantity value in a specific unit.
let time_in_nano_seconds = time.get::<uom::si::time::nanosecond>();
}
fn calc_acceleration(velocity: Velocity, time: Time) -> Acceleration {
velocity / time
}
有关更高级用法的示例,请参阅 示例目录
- si.rs -- 展示如何使用预构建的 SI 系统。
- base.rs -- 展示如何为不同的一组基本单位创建一组
Quantity类型别名。请参阅设计部分,了解选择不同基本单位的影响。 - mks.rs -- 展示如何创建一个定制的量度系统。
- unit.rs -- 展示如何向预构建的 SI 系统中的现有量度添加新的单位。
功能
uom 包含多个 Cargo 功能,用于控制可用的底层存储类型,包括预构建的 国际单位制 (SI)、支持 Serde 和 no_std 功能。以下将描述这些功能。默认启用 f32、f64、std 和 si 功能。可以通过使用编译 uom 时的 --no-default-features 和 --features "..." 标志或指定 Cargo.toml 中的功能来选择功能。
[dependencies]
uom = {
version = "0.36.0",
default-features = false,
features = [
"autoconvert", # automatic base unit conversion.
"usize", "u8", "u16", "u32", "u64", "u128", # Unsigned integer storage types.
"isize", "i8", "i16", "i32", "i64", "i128", # Signed integer storage types.
"bigint", "biguint", # Arbitrary width integer storage types.
"rational", "rational32", "rational64", "bigrational", # Integer ratio storage types.
"complex32", "complex64", # Complex floating point storage types.
"f32", "f64", # Floating point storage types.
"si", "std", # Built-in SI system and std library support.
"serde", # Serde support.
]
}
autoconvert-- 功能,用于启用二进制运算符中基本单位之间的自动转换。禁用此功能仅允许具有相同基本单位的数量直接交互。该功能的存在是为了解决编译器限制,其中对于非浮点型底层存储类型不会生成零成本代码。usize、u8、u16、u32、u64、u128、isize、i8、i16、i32、i64、i128、bigint、biguint、rational、rational32、rational64、bigrational、complex32、complex64、f32、f64-- 功能,用于启用底层存储类型。必须至少启用这些功能中的一个。默认启用f32和f64。有关选择不同底层存储类型的影响,请参阅 设计 部分。si-- 功能,用于包含预构建的 国际单位制 (SI)。默认启用。std-- 功能,用于编译时带有标准库支持。禁用此功能将使用no_std编译uom。默认启用。serde-- 功能,用于启用对 Serde crate 中的数量序列化和反序列化的支持。默认禁用。它取代了已弃用的use_serde功能,该功能将在未来的uom版本(v0.37.0 或更高版本)中删除。
设计
与 测量单位(米、千米、英尺、英里、...)不同,uom 与 量(长度、质量、时间、...)一起工作。这简化了使用,因为单位仅在接口边界处涉及:其余代码只需关注涉及的量。这也使得对量的操作(+、-、*、/、...)在运行时没有成本,超过使用原始存储类型(例如 f32)。
uom 将数值归一化到该数量的基本单位。可以通过执行为数量系统定义的宏来使用替代的基本单位(对于国际单位制,使用 ISQ!)。uom 支持以下底层存储类型:usize、u8、u16、u32、u64、u128、isize、i8、i16、i32、i64、i128、bigint、biguint、rational、rational32、rational64、bigrational、complex32、complex64、f32 和 f64。
将数值归一化到基本单位的一个后果是,对于浮点数和有理数底层存储类型,某些值可能无法表示或无法精确表示。例如,如果 length 的基本单位是 meter,而底层存储类型是 i32,那么像 1 centimeter 或 1.1 meter 这样的值就无法表示。 1 centimeter 被归一化为 0.01 meter,这无法存储在 i32 中。uom 只允许安全地使用单位。使用此库的用户仍需要了解底层存储类型的实现细节,包括限制和精度。
贡献
欢迎每个人贡献。提交一个拉取请求、一个问题或仅对现有项目添加评论。国际度量衡局(BIPM) 是一个国际标准化组织,发布了SI小册子。本文件定义了SI,并可作为 uom 变更的全面参考。非SI单位的转换系数可以在NIST特别出版物811中找到。
除非您明确表示,否则根据Apache-2.0许可证定义,任何有意提交给您的工作的贡献,应以下列方式双重许可,不附加任何额外条款或条件。
许可证
以下任一许可证下:
- Apache许可证,版本2.0(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 https://open-source.org.cn/licenses/MIT)
任选其一。
依赖项
~215–610KB
~14K SLoC