rust - 彻底匹配涉及 "larger than"情况的一系列整数

标签 rust

考虑一个带有内置整型常量的 Rust 程序 const N: u64和运行时整数值 x: u64 。我想匹配x这样值 x < N每个人都有一个单独的特殊案例。此外,x == N 应该有一个单独的案例。和一个 x > N分别。我的第一次尝试如下所示:

const N: u64 = 3;

match x {
    0 => println!("Special case for 0"),
    1 => println!("Special case for 1"),
    2 => println!("Special case for 2"),
    N => println!("Equal"),
    _ => println!("Larger"),
}

这可行,但有以下缺点:假设我将常量的值增加到 N = 4但忘记添加新的特殊情况 x = 3 。上面的代码不会在编译时捕捉到这一点,因为最后一个匹配模式( _ )也覆盖了被遗忘的情况,并且代码会默默地中断。所以我正在寻找一种具有这种编译时保证的解决方案。

要实现此目的,最后一个案例应仅匹配 x > N相反,所以我尝试使用 if条件:

match x {
    0 => println!("Special case for 0"),
    1 => println!("Special case for 1"),
    2 => println!("Special case for 2"),
    N => println!("Equal"),
    _ if x > N => println!("Larger"),
}

但现在我从 Rust 收到一个错误,表明匹配并不详尽,我认为这是由于编译器不够聪明,无法分析 if健康)状况。虽然分析范围足够聪明,但我不知道如何将最后一种情况表示为范围。它必须类似于 (N+1)..=u64::MAX ,但由于加号的原因,实际上并没有编译。

到目前为止,我最好的解决方案是使用嵌套匹配,如下所示。这似乎有效,并且在 N 时也给出了所需的编译时错误。已更改,但我想知道是否有更优雅的解决方案。

match x {
    0 => println!("Special case for 0"),
    1 => println!("Special case for 1"),
    2 => println!("Special case for 2"),
    N..=u64::MAX => match x {
        N => println!("Equal"),
        _ => println!("Larger")
    }
}

最佳答案

你可以这样做:

match x {
    0 => println!("Special case for 0"),
    1 => println!("Special case for 1"),
    2 => println!("Special case for 2"),
    N => println!("Equal"),
    N.. => println!("Larger"),
}

Playground

关于rust - 彻底匹配涉及 "larger than"情况的一系列整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77456313/

相关文章:

rust - 如何解决这个 "does not live long enough"?

rust - 使用 msgpack 编码时,JavaScript 对象的 Rust 等价物是什么?

javascript - 为什么 Rust WASM 在计算素数时比 JavaScript 慢

rust - 两个可变借用发生在同一条线上?

multithreading - 如何控制 Rust 中 2 个不同线程的打印顺序

rust - 读取和写入长时间运行的 std::process::Child

rust - 创建 Box<dyn Trait> 时如何转换为 dyn Trait

rust - 引用“静态生命周期不长?

error-handling - Rust:从标准输入读取和映射行并处理不同的错误类型

rust - 有什么理由不对不迭代一系列事物的迭代器使用 DoubleEndedIterator 吗?