考虑一个Rust程序,内置整数常量为const N: u64,运行时整数值为x: u64.我想在x上进行匹配,使得值x < N每个都得到一个单独的特例.此外,x == Nx > N分别应有一个单独的 case .我的第一次try 看起来是这样的:

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.上面的代码不会在编译时捕捉到这一点,因为最后一个匹配模式(_)也覆盖了忘记的大小写,并且代码静默中断.因此,我正在寻找一种具有这种编译时间保证的解决方案.

为了实现这一点,最后一个 case 应该只匹配x > N,所以我try 使用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相关问答推荐

在‘await’点上使用‘std::同步::Mutex’是否总是会导致僵局?

为什么我需要在这个代码示例中使用&

如何访问Rust存储值的内存地址

为什么复印是豆荚的一个重要特征?

如果A == B,则将Rc A下推到Rc B

在Rust中赋值变量有运行时开销吗?

在Rust中有没有办法在没有UB的情况下在指针和U64之间进行转换?

在UdpSocket上使用sendto时的隐式套接字绑定

为什么铁 rust S的默认排序功能比我对小数组的 Select 排序稍微慢一些?

为什么基于高山Linux的Docker镜像不能在绝对路径下找到要执行的命令?

`*mut[T]`与`*mut T`的区别

如何在不调用Collect()的情况下为新型vec实现IntoIterator?

在Rust中声明和定义一个 struct 体有什么区别

更新 rust ndarray 中矩阵的一行

Rust 异步和 AsRef 未被发送

将文件的第一行分别读取到文件的其余部分的最有效方法是什么?

我可以在不调用 .clone() 的情况下在类型转换期间重用 struct 字段吗?

为什么分配对变量的引用使我无法返回它

编写 TOML 文件以反序列化为 struct 中的枚举

为移动和借位的所有组合实现 Add、Sub、Mul、Div