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

Download history 12194/week @ 2024-04-21 13177/week @ 2024-04-28 14285/week @ 2024-05-05 13880/week @ 2024-05-12 12545/week @ 2024-05-19 14231/week @ 2024-05-26 14608/week @ 2024-06-02 11870/week @ 2024-06-09 15251/week @ 2024-06-16 12831/week @ 2024-06-23 12847/week @ 2024-06-30 16847/week @ 2024-07-07 15925/week @ 2024-07-14 19435/week @ 2024-07-21 27328/week @ 2024-07-28 20377/week @ 2024-08-04

84,435 每月下载量
130crate中(62个直接使用)

Apache-2.0 OR MIT

1MB
15K SLoC

uom

Github Actions Codecov.io Rustup.rs Crates.io Crates.io Documentation

计量单位是一个用于自动类型安全零成本的维度分析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)、支持 Serdeno_std 功能。以下将描述这些功能。默认启用 f32f64stdsi 功能。可以通过使用编译 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 -- 功能,用于启用二进制运算符中基本单位之间的自动转换。禁用此功能仅允许具有相同基本单位的数量直接交互。该功能的存在是为了解决编译器限制,其中对于非浮点型底层存储类型不会生成零成本代码。
  • usizeu8u16u32u64u128isizei8i16i32i64i128bigintbiguintrationalrational32rational64bigrationalcomplex32complex64f32f64 -- 功能,用于启用底层存储类型。必须至少启用这些功能中的一个。默认启用 f32f64。有关选择不同底层存储类型的影响,请参阅 设计 部分。
  • si -- 功能,用于包含预构建的 国际单位制 (SI)。默认启用。
  • std -- 功能,用于编译时带有标准库支持。禁用此功能将使用 no_std 编译 uom。默认启用。
  • serde -- 功能,用于启用对 Serde crate 中的数量序列化和反序列化的支持。默认禁用。它取代了已弃用的 use_serde 功能,该功能将在未来的 uom 版本(v0.37.0 或更高版本)中删除。

设计

测量单位(米、千米、英尺、英里、...)不同,uom(长度、质量、时间、...)一起工作。这简化了使用,因为单位仅在接口边界处涉及:其余代码只需关注涉及的量。这也使得对量的操作(+、-、*、/、...)在运行时没有成本,超过使用原始存储类型(例如 f32)。

uom 将数值归一化到该数量的基本单位。可以通过执行为数量系统定义的宏来使用替代的基本单位(对于国际单位制,使用 ISQ!)。uom 支持以下底层存储类型:usizeu8u16u32u64u128isizei8i16i32i64i128bigintbiguintrationalrational32rational64bigrationalcomplex32complex64f32f64

将数值归一化到基本单位的一个后果是,对于浮点数和有理数底层存储类型,某些值可能无法表示或无法精确表示。例如,如果 length 的基本单位是 meter,而底层存储类型是 i32,那么像 1 centimeter1.1 meter 这样的值就无法表示。 1 centimeter 被归一化为 0.01 meter,这无法存储在 i32 中。uom 只允许安全地使用单位。使用此库的用户仍需要了解底层存储类型的实现细节,包括限制和精度。

贡献

欢迎每个人贡献。提交一个拉取请求、一个问题或仅对现有项目添加评论。国际度量衡局(BIPM) 是一个国际标准化组织,发布了SI小册子。本文件定义了SI,并可作为 uom 变更的全面参考。非SI单位的转换系数可以在NIST特别出版物811中找到。

除非您明确表示,否则根据Apache-2.0许可证定义,任何有意提交给您的工作的贡献,应以下列方式双重许可,不附加任何额外条款或条件。

许可证

以下任一许可证下:

任选其一。

依赖项

~215–610KB
~14K SLoC