匹配浮点范围的替代方法

问题描述 投票:6回答:1

编写一系列浮点范围比较的最佳方法是什么?要使用下面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个回答
5
投票

我个人会这样做:

trait InRange {
    fn in_range(&self, begin: Self, end: Self) -> bool;
}

impl InRange for f32 {
    fn in_range(&self, begin: f32, end: f32) -> bool {
        *self >= begin && *self < end
    }
}

fn main () {
    let color = match foo {
        x if x.in_range(0.0, 0.1) => Color::Red,
        x if x.in_range(0.1, 0.4) => Color::Yellow,
        x if x.in_range(0.4, 0.8) => Color::Blue,
        _ => Color::Grey,
    };
}
© www.soinside.com 2019 - 2024. All rights reserved.