3 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2015 年 5 月 29 日 |
---|---|
0.0.2 | 2015 年 5 月 28 日 |
0.0.1 | 2015 年 5 月 26 日 |
#1742 在 Rust 模式 中
19KB
317 行
units
为 Rust 单位。易于使用,类型安全和可自定义。
使用示例
#[macro_use] extern crate units;
// It is recommended to put units inside a separate module
pub mod my_units {
// Here we define our unit system with three units
units! {
MyUnits {
Meter[m],
Second[s],
Mile[mile]
}
}
}
// Import the unit constants and also the dimensionless unit `one`
use my_units::f64::{one, m, s, mile};
fn main() {
let km = 1000.*m; // Define the `km` unit as 1000 meter
let h = 60.*60.*s; // Define an hour as 60 * 60 seconds
// These units could also have been defined as separate base units,
// in order to further reduce the risk to mix them up.
// Let's calculate how far a car has moved if it has accelerated
// uniformly from 0 to 100 km/h in 12 seconds
let initial_speed = 0.*km/h;
let final_speed = 100.*km/h;
let time = 12.*s;
let acceleration = (final_speed - initial_speed)/time;
let result = 0.5 * acceleration * time * time; // s = a/2 * t^2
// Here we use debug formatting, which will automatically print the base dimensions
println!("{:?}", result); // This will print `166.66666666666669 m`
// Let's convert the result to miles
let meter_per_mile = 1609.344*m/mile; // This has unit `m/mile`
let result_in_miles = result / meter_per_mile; // This has unit `mile`
// Here we get a dimensionless value by eliminating the unit, then use deref (*) to extract the raw f64.
println!("{} miles", *(result_in_miles/mile)); // This will print `0.103561865372889 miles`
// Now we want to know how long a ball will fall until it reaches the
// floor if dropped from a height of 10 meters
let height = 1.5*m;
let g = 9.81*m/s/s; // Use a gravitational constant of 9.81 m/s^2
let time = (2. * height / g).sqrt(); // sqrt() takes care of the units
// Print the result in milliseconds and round to 2 digits
let ms = 0.001*s; // 1 ms = 0.001 s
println!("The ball falls for {:.2} ms until it hits the ground.", *(time/ms));
// The above will print `The ball falls for 553.00 ms until it hits the ground.`
}
使用 cargo run --example basics
来运行此示例。
还有一个用于为值分配单位的安全语法,但此功能目前仅在 Rust nightly 中可用。请参阅 examples/basics.rs 以查看两个版本。
它是如何工作的?
上述宏调用将生成一个结构体 MyUnits<U,T=f64>
,其中第一个类型参数是一个特殊标记,用于获取正确的维度(它包含每个基本单位的指数,编码为 类型级别的整数)。 Meter
、Second
和 Mile
将是具有正确指数的标记类型的类型别名。
第二个类型参数表示包装的数值类型(默认为 f64
)。然后自动生成的子模块 my_units::f64
和 my_units::f32
都包含常量 m
、s
和 mile
,每个都具有正确的维度并包装值 1.0
。例如,f64::m
的类型为 MyUnits<Meter, f64>
。
此外,还提供了类型 One
和常量 one
用于无单位的值,并且只有这些值可以使用 Deref
特性进行解包(这对于方法调用来说自动生效,但有时需要使用 *
前缀运算符来显式表示,参见上面的示例)。
依赖关系
~28KB