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 值格式化
每月83次下载
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)。
数量和单位
此库由三组数据结构组成
- 单元数据结构。这些存储有关单位本身的数据,以及存储单元定义本身的数据(例如,单位的大小和将给定单位转换为基本数量的转换因子)。如果启用serde,则可以序列化这些数据,如果启用utoipa功能标志,则可以转换为utoipa模式。
- 标量数量数据结构。这些存储一个标量值和一个相关的单位。与(2)类似可序列化,并且可以直接在这些数据结构上执行大多数数学运算(例如标量乘法/除法,将数量相乘,相等运算符)。
- 数组数量数据结构。这些存储一个数组和相关的单位。与(2)类似。
更多细节
所有可用的单位都包含在Units
枚举中。可以从UnitTypes
枚举中轻松检索可用单位的列表。对于每个处理的数量(取决于您编译的功能),为每种单位类型创建一个单位枚举(例如LengthUnit
、EnergyUnit
)。
数量包含一个值(目前限制为f64),以及上述单位枚举来存储单位。然后将其转换为QuantityBase
。所有可用的数量都可以封装在Quantities
枚举中。为每个数量创建一个结构体(例如Length
、Area
),这些结构体包含将单位从Units
或其自身内部单位枚举进行转换的方法。以Length
为例,它可以从给定的LengthUnit
转换,并包含将当前单位转换为其他枚举(例如to_meters
、to_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