混淆无法访问的模式错误

时间:2014-05-22 14:44:21

标签: rust

使用match语句时,我遇到了一个来自Rust编译器的非常令人困惑的错误消息。

enum Name {
    Known,
}

fn unreachable_pattern(n: Name) -> usize {
    use Name::*;

    match n {
        Unknown => 1,
        Known => 1,
    }
}

Rust编译器抱怨无法访问的模式:

error[E0001]: unreachable pattern
  --> src/main.rs:10:9
   |
10 |         Known => 1,
   |         ^^^^^ this is an unreachable pattern
   |
note: this pattern matches any value
  --> src/main.rs:9:9
   |
9  |         Unknown => 1,
   |         ^^^^^^^

,真正的错误是Unknown的定义中缺少Name,当您还没有其他40种变体时更容易发现

1 个答案:

答案 0 :(得分:7)

这实际上是目前已知的问题;它不是一个适当的错误,而是一个实施质量问题。

问题归结为无可辩驳的匹配,即:

match variable {
    1 => 2,
    i => 2 * i
}

此处i无可辩驳的匹配,意味着始终匹配,无论variable的值是什么。


好吧,我们对这个奇怪的报告也有同样的问题:因为Unknown未知,所以它成为无可辩驳的匹配中变量的名称!当然,这是无意的,但它对编译器来说非常有意义。

好消息是,一旦 next 尝试匹配,编译器就会开始抱怨,因此您可以轻松找到哪个匹配是无可辩驳的。

样式lint is expected可以帮助解决这个问题,它会将Unknown报告为一个不正确的大写变量,从而强调编译器不会将其视为枚举变体。

此错误有很多变化(请参阅重复项),也可能是由于导致enum导入不正确而导致其变体范围不正确。