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://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 https://opensource.org/licenses/MIT)
任选其一。
依赖项
~215–610KB
~14K SLoC