#units #dimension #unit #physics-simulation #unit-conversion #unit-system #quantities

no-std dimensioned

使用 Rust 的类型系统进行编译时尺寸分析,用于各种单位系统。Dimensioned 致力于通过添加无运行时成本的单位安全来构建在 Rust 的安全特性之上。此外,它旨在尽可能简单易用,希望通过避免错误并清晰地显示单位,使您的工作更加容易。再也不需要在注释中指定单位了!

27 个版本

0.8.0 2022年4月29日
0.7.0 2018年8月13日
0.6.0 2017年3月3日
0.5.0 2015年12月3日
0.0.1 2014年11月21日

#58 in 科学

Download history 12139/week @ 2024-04-22 9762/week @ 2024-04-29 15862/week @ 2024-05-06 14010/week @ 2024-05-13 12324/week @ 2024-05-20 9966/week @ 2024-05-27 18388/week @ 2024-06-03 11297/week @ 2024-06-10 13243/week @ 2024-06-17 8753/week @ 2024-06-24 6987/week @ 2024-07-01 10092/week @ 2024-07-08 9936/week @ 2024-07-15 12350/week @ 2024-07-22 10650/week @ 2024-07-29 8625/week @ 2024-08-05

41,567 每月下载量
16 Crates 中使用 (14 个直接使用)

MIT/Apache 许可协议

145KB
2.5K SLoC

crates.io Build Status

文档

Dimensioned

一个用于编译时尺寸分析的 Rust 库。

它的目标是提供零成本的单位安全,同时需要程序员付出最少的努力。

使用方法

Dimensioned 至少需要 Rust 版本 1.23.0(并且在此版本上进行了测试),尽管某些功能可能需要更高版本的 Rust。

它不依赖于 std;简单包含而不使用默认的 std 功能。这样做需要 rustc 的夜间版本。

如果您正在使用 Rust 夜间版本,则可以启用 dimensioned 的 "oibit" 功能。这将使它更好地处理单位封装非原语。使用 dimensioned 的推荐方法是仅封装原语,在这种情况下,此功能无助于改进。

贡献

欢迎贡献!虽然贡献指南不是很严格,但我有一些请求。

  • CHANGELOG.md 中注意您所做的更改。
  • 为添加的任何内容添加文档和测试。
  • 尽量在未使用 rustfmt 的文件中按字母顺序排列列表。
  • 如果您在我未及时回复您的情况下,不要犹豫,向我提出建议。我可能会忙乱和健忘,但我会尽快回复问题和 PR。
  • 随时提问!

示例

《仿真示例》提供了一个简单的物理仿真,并涵盖了如何以几种不同的方式使用维度,以及其权衡。如果你对将维度添加到你的项目中可能涉及的内容或它在半真实代码中的样子感兴趣,那么这个地方就是你的去处。

《转换示例》涵盖了如何实现单位系统之间的转换。

最后,为了激发灵感,这里有一个简单的示例,展示了维度的一些功能。

extern crate dimensioned as dim;

use dim::{si, cgs};

// Calculates speed given a distance and time. Only works for SI units.
fn speed(dist: si::Meter<f64>, time: si::Second<f64>) -> si::MeterPerSecond<f64> {
    dist / time
}

use std::ops::Div;
use dim::dimensions::{Length, Time};
use dim::typenum::Quot;

// Calculates speed as before, but now we can use *any* unit system.
fn generic_speed<L, T>(dist: L, time: T) -> Quot<L, T>
    where L: Length + Div<T>, T: Time,
{
    dist / time
}

fn main() {
    let si_x = 6.0 * si::M;
    let si_t = 3.0 * si::S;
    let si_v = 2.0 * si::M / si::S;

    let si_v2 = speed(si_x, si_t);
    assert_eq!(si_v, si_v2);

    let cgs_x = 6.0 * cgs::M;
    let cgs_t = 3.0 * cgs::S;
    let cgs_v = 2.0 * cgs::M / cgs::S;

    let cgs_v2 = generic_speed(cgs_x, cgs_t);
    assert_eq!(cgs_v, cgs_v2);

    let si_v3 = cgs_v2.into();
    assert_eq!(si_v2, si_v3);
}

此示例也包含在 examples/readme-example.rs 中。

单位系统

维度旨在包含各种用途的单位系统。它还包括一个 make_units! 宏,允许你创建你想要的任何单位系统。

错误消息

维度最大的弱点可能是生成的错误消息。从维度来的类型签名往往看起来像一堆乱七八糟的东西。将来,我们可能会有更好的方法来显示它们。

目前,我的建议是,当你收到涉及 维度 的错误消息时,只需查看行号,希望问题会从代码本身中显而易见。

维度好友

如果有任何库与维度配合得很好,例如仿真示例第三部分中使用的 vector3d 库,请告诉我,它们将被列在这里。

依赖关系

~0.3–1MB
~18K SLoC