#unit #measurement #systems #mass #length #value #dims

no-std dims_core

生成单位和系统的核心工具

7 个不稳定版本

0.5.1 2024年6月22日
0.5.0 2024年6月15日
0.4.1 2022年12月31日
0.3.1 2022年1月24日
0.2.1 2022年1月18日

科学 中排名 613

每月下载量 25
3 crates 中使用

MIT 许可证

16KB
241

dims_core

这个 Crates 集合用于设置类型安全的测量。

这允许创建诸如距离或质量的存储类型,以及防止将克加到英尺上。

目的是将这些值保留在内存中作为 MassLength,无需担心单位,除非创建值或访问它(用于显示、存储等)。

重要

这仍处于开发中。请期待一些粗糙的边缘,但我正在努力使它们变得平滑。

系统和单位创建

这些特定的系统已在 dims 中设置,但你也可以设置自己的系统

UnitSimple 使用的转换公式如下

    /// Convert the given value from this unit into the base
    fn to_base(&self, val: Flt) -> Flt {
        (val + self.offset) * self.ratio
    }
    /// Convert the given value (as the base unit) into this unit
    fn to_self(&self, val: Flt) -> Flt {
        (val / self.ratio) - self.offset
    }

这允许具有相同零点的基本单位(其中大部分),以及具有不同零点(如温度)的单位。


  • 用于构建一组单位的核心组件。
  • 这里不存储任何实际单位(甚至测量系统)。
  • 如果想要自己创建 UnitMeasureSystem,则可以直接使用此 crate。
  • 存储的值未指定,而是保持通用。最常见的选择可能是 f32f64(如在此处的 dims crate 中使用),但保持通用。

基本结构和特质

  • MeasureSystem:测量系统(例如长度、质量、体积),用于防止测量值之间的交叉。这些在 dims 中实现。
  • Measure:存储的实际值。创建的任何值(如英寸或磅)都将转换为基本单位(例如长度为米,质量为克)。
  • UnitTrait:用于创建单位类型的特质。这允许创建单位之间的自定义转换函数。在几乎所有情况下,都可以使用 UnitSimple
  • UnitSimple:是UnitTrait的基本实现。指定单位和基础单位之间的比例以及偏移量被指定。
  • UnitFormat:是UnitTrait的一个更复杂的实现。指定单位和基础单位之间的比例以及偏移量。此外,还存储了单位的文本名称。

其他重要项目

  • MultiplyBy & DivideBy:允许在不同单位系统之间进行转换的特质。例如
    • Length * Length = Area
    • Length * Area = Volume
    • Volume / Area = Length
  • 您还可以通过存储的数据类型进行乘法和除法。例如
    let len = MM.from(8.0);
    let two = len * 2.0;
    let one = two / 2.0;

DEBUG_UNIT是调试时值将如何显示。这可能是您想要显示的方式,但应该由消费代码明确指定。

其他说明

性能

与存储值相比,发布性能没有可测量的影响(从我非常基本的测试中可以看出)。Measure结构是[repr(transparent)],所以除了值本身之外的所有内容都进行了优化。然而,调试模式代码会对性能产生影响。

存储选项

  • std是默认选项,默认使用标准库。
    这启用了UnitFormatTrait(因为函数返回String),但no_std仍然可以与str一起使用(见下文)来存储单位名称信息。
  • str(默认)将利用UnitFormat并存储
    • abbr:缩写单位名称(例如mft
    • singular:单位的单数名称(例如metrefoot
    • plural:单位的复数名称(例如metresfeet

依赖项

~0.3–0.8MB
~19K SLoC