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日 |
#10 in #measurement
63KB
1.5K SLoC
dims
这允许存储诸如距离或质量等值,同时防止将克加到英尺上。
意图是将这些值保留在内存中作为 Mass
或 Length
,无需担心单位,除非在创建值时以及访问它时(用于显示、存储等)。
重要
这仍然是一个进行中的项目。请期待粗糙的边缘,但我正在努力使之平滑。
用法
如果您只想使用预生成的单位(正在进行中:创建更多)
// Be sure you include prelude; this exposes required traits
use dims::prelude::*;
use dims::us::*;
use dims::si::*;
let feet = FOOT.from(12.5);
let mm = MILLIMETRE.from(317.5);
assert_eq!(feet, mm);
// You can add between different systems
// They are all stored as `metre` here, anyway
let another = feet + mm;
// You can also multiply to get area (and on further to get volume)
let area = feet * mm;
assert_eq!(area, SQFT.from(156.25));
let mass = GRAM.from(18.25);
// You can also create them the other way around
let this_works = Measure::new(&INCH,0.125);
// You can grab the stored value as a float via
let raw = mm.val_as(&INCH);
// The compiler will not allow you to add between systems:
// let nope = mass + area; // <== Compiler throws an error
基础结构和特质
MeasureSystem
:一个度量系统(例如:长度、质量、体积),用于防止Measure
之间的交叉。这些在dims
中实现。Measure
:实际存储的值。创建的任何值(如英寸或磅)都将转换为基本单位(例如:长度为米,质量为克)。UnitTrait
:一个用于创建单位类型的特质。这允许创建单位之间的自定义转换函数。在几乎所有情况下,都可以使用UnitSimple
。UnitSimple
:UnitTrait
的基本实现。指定单位和基本单位之间的比率以及偏移量。UnitFormat
:比UnitTrait
更复杂的实现。指定单位和基本单位之间的比率以及偏移量。此外,还存储单位的文本名称。
dims
这包含一组预制的系统和单位。随着时间的推移,将不断添加。
当前系统是
系统 | 基本单位 | debug_us |
---|---|---|
长度 | 米 | 英寸 |
面积 | 平方米 | 平方英寸 |
体积 | 立方米 | 立方英寸 |
质量 | 克 | 磅 |
温度 | 开尔文* | 华氏度 |
*关于温度的说明
- 不检查负值,因为吸热反应在应用于环境时会有负值。
- 此调试单位的为摄氏度
其他说明
性能
与存储值(从我非常基础的测试中可以看出)相比,对发布性能没有可测量的影响。`Measure
`结构体是`[repr(transparent)]
`,因此除了值本身之外的所有内容都被优化掉了。调试模式代码会对性能产生影响。
dims
的包选项
f64
可用作为选项;默认为f32
。使用自定义单位时可以指定其他数据类型(请参阅dims_core
)std
是默认选项,默认使用标准库。
这启用了UnitFormatTrait
(因为函数返回String
),但仍然可以使用no_std
与str
(见下文)来存储单位名称信息。str
(默认)将利用UnitFormat
并存储abbr
:单位名称的缩写(例如m
或ft
)singular
:单位的单数名称(例如metre
或foot
)plural
:单位的复数名称(例如metres
或feet
)
si
提供SI/公制单位(默认开启)us
提供美制单位(默认开启)debug_us
将使用上表指定的单位进行调试。
重要
在上面的选项中选择us
或debug_us
将不会改变基本单位。它仍然以SI为单位存储。
依赖项
~0.4–0.9MB
~20K SLoC