4个版本 (2个破坏性更新)

新增 0.4.0 2024年8月10日
0.3.1 2024年8月6日
0.3.0 2024年8月5日
0.2.0 2024年8月5日

#quantities中排名6

Download history 351/week @ 2024-08-05

每月下载量351
dana中使用

Apache-2.0

48KB
1K SLoC

Dana

Crates.io docs.rs

通过泛型类型实现编译时维度分析。

概述

维度分析是一种通过跟踪单位之间的关系来确保计算正确性的方法。这也可以在无需查找的情况下确定关系时非常有用。例如,假设你有时间t (T) 和速度v (L/T),你想要找到距离d (L)。简单的代数可以告诉你L = (L/T) × T,因此,d = v × t

这个库使用Rust的静态类型系统来实现这些检查。因此,任何单位之间的不兼容性都会成为编译时错误,确保所有代码都是维度一致的。


这个函数可以成功编译

use dana::{Quantity, units::{Length, Speed, Time}};

fn speed(dist: Quantity<Length>, time: Quantity<Time>) -> Quantity<Speed> {
    dist / time
}

这个函数,因为Speed被定义为UnitDiv<Length, Time>,所以无法编译,因为它会引发一个mismatched types错误,因为表达式是错误的

use dana::{Quantity, units::{Length, Speed, Time}};

fn speed(dist: Quantity<Length>, time: Quantity<Time>) -> Quantity<Speed> {
    time / dist
}
error[E0308]: mismatched types
 --> src/main.rs:4:5
  |
3 | fn speed(dist: Quantity<Length>, time: Quantity<Time>) -> Quantity<Speed> {
  |                                                           --------------- expected `Quantity<UnitDiv<Length, Time>>` because of return type
4 |     time / dist
  |     ^^^^^^^^^^^ expected `Quantity<UnitDiv<Length, Time>>`, found `Quantity<UnitDiv<Time, Length>>`
  |
  = note: expected struct `Quantity<UnitDiv<Length, Time>>`
             found struct `Quantity<UnitDiv<Time, Length>>`

有关更多信息,请参阅库文档

Cargo功能

以下Cargo功能可用于启用额外功能

  • chrono:支持在 Quantity<Time>chrono::TimeDelta 之间进行转换
  • rand:支持 rand 抽样特性
  • serde:支持 serde 特性
  • simd:使用不稳定功能 portable_simd 的实验性 QtySimd 数组

依赖项

~0.8–1.3MB
~28K SLoC