穷举整数匹配

时间:2014-08-03 22:26:09

标签: rust

我尝试详尽地匹配这样的整数:

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仍然需要明显无法访问的_手臂?

3 个答案:

答案 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是非常愚蠢的,在这种情况下你应该只使用该值。