混淆无法访问的模式错误

Mat*_* M. 8 rust

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

enum Name {
    Known,
}

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

    match n {
        Unknown => 1,
        Known => 1,
    }
}
Run Code Online (Sandbox Code Playgroud)

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,
   |         ^^^^^^^
Run Code Online (Sandbox Code Playgroud)

对于人类而言,真正的错误是Unknown定义中缺少的Name,当您还没有其他40个变体时更容易发现.

Mat*_* M. 7

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

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

match variable {
    1 => 2,
    i => 2 * i
}
Run Code Online (Sandbox Code Playgroud)

i是一个无可辩驳的匹配,意味着它总是匹配,无论价值如何variable.


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

好消息是编译器会在下次尝试匹配时立即开始抱怨,这样您就可以轻松找出哪个匹配是无可辩驳的.

期望样式lint 在这个问题上有所帮助,它会报告Unknown是一个不正确的大写变量,因此强调编译器不会将它视为枚举变体.

这个bug存在很多变化(请参阅重复项),也可能是由于导入不正确导致的enum,因此没有变体.