考虑一个Rust程序,内置整数常量为const N: u64
,运行时整数值为x: u64
.我想在x
上进行匹配,使得值x < N
每个都得到一个单独的特例.此外,x == N
和x > 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")
}
}