5个版本
0.1.8 | 2020年10月10日 |
---|---|
0.1.3 | 2020年10月10日 |
0.1.2 | 2020年10月10日 |
0.1.1 | 2020年10月10日 |
0.1.0 | 2020年10月10日 |
#1071 in Rust模式
514 每月下载量
用于 2 crates
10KB
76 行
min-max: Rust的max!
和min!
宏
为什么使用它?
有时你想要找出一组标量的最大值。通常你会写一些像这样的事情:max(x1, max(x2, max(x3, x4)))
。这个crate提供的max!
宏将此简化为max!(x1, x2, x3, x4)
。(注意,对于可迭代的集合,你会使用xx.iter().max()
)。
用法
将其添加到您的 Cargo.toml
min-max = "0.1"
然后,例如
use min_max::*;
fn main() {
let max = max!(1, 5, 7, 2, 4, 9, 3);
assert_eq!(max, 9);
let min = min!(1, 5, 7, 2, 4, 9, 3);
assert_eq!(min, 1);
let min_max = min_max!(1, 5, 7, 2, 4, 9, 3);
assert_eq!(min_max, (min, max));
}
它能在浮点数上工作吗?
是的。但你需要使用max_partial!
/min_partial!
use min_max::*;
fn main() {
let partial_max = max_partial!(1.8f64, 5.8, 7.8, 2.8, 4.8, 9.8, 3.8);
assert!((9.8 - partial_max).abs() < 1e-5);
let partial_min = min_partial!(1.8f64, 5.8, 7.8, 2.8, 4.8, 9.8, 3.8);
assert!((1.8 - partial_min).abs() < 1e-5);
}
关于NaN
呢?
当你的数据包含NaN
时不要使用它。当NaN
在末尾时,返回NaN
。否则,返回排除NaN
的最小/最大值。
use min_max::*;
fn main() {
let partial_max = max_partial!(1.8, 5.8, f64::NAN, 2.8, 4.8, 9.8, 3.8);
assert!((9.8 - partial_max).abs() < 1e-5);
let partial_max = max_partial!(1.8, 5.8, 2.8, 4.8, 9.8, 3.8, f64::NAN);
assert!(partial_max.is_nan());
let partial_min = min_partial!(1.8, 5.8, f64::NAN, 2.8, 4.8, 9.8, 3.8);
assert!((1.8 - partial_min).abs() < 1e-5);
let partial_min = max_partial!(1.8, 5.8, 2.8, 4.8, 9.8, 3.8, f64::NAN);
assert!(partial_min.is_nan());
}
我能使用自定义类型吗?
当然可以,为什么不呢?
use min_max::*;
#[derive(Debug, Ord, PartialOrd, Eq, PartialEq, Clone, Copy)]
struct Point {
x: u16,
y: u16,
}
fn main() {
let a = Point { x: 5, y: 8 };
let b = Point { x: 10, y: 92 };
let c = Point { x: 0, y: 3 };
let max = max!(a, b, c);
assert_eq!(max, b);
}
内部是如何工作的?
嗯,max!(x1, x2, x3)
展开为
std::cmp::max(x1, std::cmp::max(x2, std::cmp::max(x3)))
等等。 min!
的工作方式类似,但使用的是std::cmp::min
。
min_partial!
和max_partial
使用来自partial-min-max
crate的min
和max
函数。