gpt4 book ai didi

rust - 匹配浮点范围的替代方法

转载 作者:行者123 更新时间:2023-11-29 07:46:26 25 4
gpt4 key购买 nike

编写一系列浮点范围比较的最佳方法是什么?要使用下面 GitHub 评论中的示例,

let color = match foo {
0.0...0.1 => Color::Red,
0.1...0.4 => Color::Yellow,
0.4...0.8 => Color::Blue,
_ => Color::Grey,
};

天真的解决方案将是一个痛苦的 if-else 链:

let color = {
if 0.0 <= foo && foo < 0.1 {
Color::Red
}
else if 0.1 <= foo && foo < 0.4 {
Color::Yellow
}
else if 0.4 <= foo && foo < 0.8 {
Color:: Blue
}
else {
Color::Grey
}
}

这真的是最好的选择吗?一定有更好的写法,对吧?


Alternatives to matching floating points相关,但这是用于范围比较。

最初在 the tracking issue 中提到对于 illegal_floating_point_literal_pattern,以及我经常遇到的问题。

最佳答案

自 Rust 1.35 起,InRange功能 implemented by Boiethios已在 contains 中提供Range<f32> 上的方法:

impl From<f32> for Color {
fn from(f: f32) -> Color {
match f {
x if (0.0..0.1).contains(&x) => Color::Red,
x if (0.1..0.4).contains(&x) => Color::Yellow,
x if (0.4..0.8).contains(&x) => Color::Blue,
_ => Color::Grey,
}
}
}

但是,我倾向于只对每个数字进行一次比较,这样可以减少拼写错误引入错误的可能性:

impl From<f32> for Color {
fn from(f: f32) -> Color {
match f {
x if x < 0.0 => Color::Grey;
x if x < 0.1 => Color::Red,
x if x < 0.4 => Color::Yellow,
x if x < 0.8 => Color::Blue,
_ => Color::Grey,
}
}
}

这种样式还使返回 Color::Grey 的两个不相交范围更加明显。 : x < 0.0x >= 0.8 .

另见

关于rust - 匹配浮点范围的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49037111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com