#si-units #dimensional-analysis #units #unit-conversion #measurement #si #unit

无std runtime_units

这是一个运行时Rust库,用于处理测量单位和它们之间的转换

14个版本

0.3.0 2024年6月11日
0.2.5 2024年4月16日
0.2.3 2024年3月20日
0.1.6 2024年3月12日
0.1.1 2024年2月28日

#44 in 值格式化

Download history 283/week @ 2024-04-13 10/week @ 2024-04-20 3/week @ 2024-05-18 2/week @ 2024-05-25 1/week @ 2024-06-01 140/week @ 2024-06-08 14/week @ 2024-06-15 9/week @ 2024-07-06 74/week @ 2024-07-27

每月83次下载

MIT许可证

725KB
8K SLoC

runtime_units

此库的目标是作为一个运行时Rust库,用于处理测量单位和它们之间的转换。大多数Rust的强大单元库都是为了编译时恒定分析设计的。如果您需要这些crate之一,您可能应该使用其中的一个。

大部分代码(尤其是单元定义)是从出色的uom库(https://github.com/iliekturtles/uom)改编而来。此库旨在支持编译时分析不适用的情况。目前可以处理除温度以外的所有由uom支持的转换(支持温度区间)。

用法

包含所有单位和序列化支持的示例

[dependencies]
runtime_units = { version = "0.3.0", features = ["All", "serde"] }

如果移除了std功能标志,则支持no_std

支持将单个单元类型作为功能使用,允许您将库缩减到所需的内容。序列化可以通过serde功能标签进行可选支持,并通过utoipa标签生成可选的utoipa模式。默认情况下,仅启用基础SI单位(https://en.wikipedia.org/wiki/SI_base_unit)。

数量和单位

此库由三组数据结构组成

  1. 单元数据结构。这些存储有关单位本身的数据,以及存储单元定义本身的数据(例如,单位的大小和将给定单位转换为基本数量的转换因子)。如果启用serde,则可以序列化这些数据,如果启用utoipa功能标志,则可以转换为utoipa模式。
  2. 标量数量数据结构。这些存储一个标量值和一个相关的单位。与(2)类似可序列化,并且可以直接在这些数据结构上执行大多数数学运算(例如标量乘法/除法,将数量相乘,相等运算符)。
  3. 数组数量数据结构。这些存储一个数组和相关的单位。与(2)类似。

更多细节

所有可用的单位都包含在Units枚举中。可以从UnitTypes枚举中轻松检索可用单位的列表。对于每个处理的数量(取决于您编译的功能),为每种单位类型创建一个单位枚举(例如LengthUnitEnergyUnit)。

数量包含一个值(目前限制为f64),以及上述单位枚举来存储单位。然后将其转换为QuantityBase。所有可用的数量都可以封装在Quantities枚举中。为每个数量创建一个结构体(例如LengthArea),这些结构体包含将单位从Units或其自身内部单位枚举进行转换的方法。以Length为例,它可以从给定的LengthUnit转换,并包含将当前单位转换为其他枚举(例如to_metersto_kilometers等)的帮助方法。

示例

use runtime_units::{Length, Acceleration, UnitTypes, Units, QuantityBase, Time};

fn example()
{
    let length = Length::meter(10.0);
    let length_cm = length.to_centimeter();
    assert_eq!(length, length_cm);
    let velocity = Acceleration::meter_per_second_squared(1.0) * Time::second(10.0);
    assert_eq!(length / Time::second(1.0), velocity); 

    let unit = Units::Length(units::LengthUnit::angstrom);
    let _ = length.try_convert(unit).unwrap();

    // list units available for Length:
    for unit in UnitTypes::Length.units()
    {
        println!("{unit}");
    }

    let quantity = Quantities::Acceleration(Acceleration::centimeter_per_second_squared(10.0));
    assert_eq!(velocity, QuantityBase::from(quantity) * Time::second(100.0));

    // Get a unit type from a string
    let _units = UnitTypes::Length.to_unit("m").unwrap();

    // Different ways to print base units of a quantity
    println!("Base Units of Velocity = {}", velocity.definition().unit_string());
    println!("Base Units of Acceleration = {}", Acceleration::meter_per_second_squared(1.0).definition().unit_string());
    
}

性能

目前,在笔记本电脑上,如果在同一数量之间进行转换,转换成本小于1纳秒,使用从Quantity的转换方法,最高可达3纳秒。

API稳定性

这个库仍在开发中。随着其成熟,预计API将进行进一步更改。

欢迎提交拉取请求。大部分转换基于UOM数据。

依赖项

~0.3–1.8MB
~40K SLoC