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模式

Download history 268/week @ 2024-03-13 189/week @ 2024-03-20 78/week @ 2024-03-27 208/week @ 2024-04-03 138/week @ 2024-04-10 133/week @ 2024-04-17 100/week @ 2024-04-24 109/week @ 2024-05-01 156/week @ 2024-05-08 151/week @ 2024-05-15 174/week @ 2024-05-22 154/week @ 2024-05-29 87/week @ 2024-06-05 138/week @ 2024-06-12 151/week @ 2024-06-19 118/week @ 2024-06-26

514 每月下载量
用于 2 crates

MIT 许可证

10KB
76

min-max: Rust的max!min!

crates.io crates.io crates.io

为什么使用它?

有时你想要找出一组标量的最大值。通常你会写一些像这样的事情: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 crateminmax函数。

依赖项