我尝试详尽地匹配这样的整数:
fn main() {
for test in range(std::u8::MIN, std::u8::MAX) {
match test {
0x00..0xff => {},
}
}
}
但是编译器抱怨道:
all.rs:3:9: 6:10 error: non-exhaustive patterns: `_` not covered [E0004]
all.rs:3 match test {
all.rs:4 0x00..0xff => {},
all.rs:5 }
error: aborting due to previous error
但是,涵盖了所有可能的值。快速检查确认了这一点:
fn main() {
for test in range(std::u8::MIN, std::u8::MAX) {
match test {
0x00..0xff => {},
_ => fail!("impossible"),
}
}
}
现在编译并运行它:
$ rustc all.rs
$ ./all
$
涵盖了所有可能的值,为什么rustc仍然需要明显无法访问的_
手臂?
答案 0 :(得分:5)
Rust 1.33.0 中的穷举整数匹配 was stabilised。问题 now works 中的原始示例(更新为对范围使用现代语法)。
fn main() {
for i in std::u8::MIN..=std::u8::MAX {
match i {
0x00..=0xff => {}
}
}
}
答案 1 :(得分:3)
正如引用的issue中所讨论的,Rust的详尽检查完全基于枚举而从不是值,因此失败是因为d[Reduce(`+`,lapply(d[1:3], is.na)) <2,]
根本不是枚举类型。
答案 2 :(得分:-2)
我认为编译只是看到你在类型u8
上匹配(虽然任何数字类型都适用于这个参数),并且为了简单起见,实际上并没有检查你的模式是否覆盖了整个范围。对于编译器来说,期望您使用_
进行“全部捕获”并让开发人员处理它会更容易。
还要考虑当你要以任何方式匹配每个结果时使用match
是非常愚蠢的,在这种情况下你应该只使用该值。