Rust 混淆不可达模式错误

Rust 混淆不可达模式错误,rust,Rust,在使用match语句时,我遇到了来自Rust编译器的一条非常混乱的错误消息 enum Name { Known, } fn unreachable_pattern(n: Name) -> usize { use Name::*; match n { Unknown => 1, Known => 1, } } Rust编译器抱怨无法访问的模式: 错误[E0001]:无法访问的模式 -->src/main.rs:

在使用
match
语句时,我遇到了来自Rust编译器的一条非常混乱的错误消息

enum Name {
    Known,
}

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

    match n {
        Unknown => 1,
        Known => 1,
    }
}
Rust编译器抱怨无法访问的模式:

错误[E0001]:无法访问的模式
-->src/main.rs:10:9
|
10 |已知=>1,
|^^^^^^这是一种无法达到的模式
|
注意:此模式匹配任何值
-->src/main.rs:9:9
|
9 |未知=>1,
|         ^^^^^^^

对于人类来说,真正的错误是
名称的定义中缺少了
未知
,当您还没有40个其他变体时,这更容易发现。

这实际上是目前已知的问题;这不是一个bug本身,而是一个实现质量问题

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

这里的
i
是一个无可辩驳的匹配,这意味着它总是匹配的,无论
变量的值是多少


嗯,我们对那个奇怪的报告也有同样的问题:因为
Unknown
是Unknown,所以它变成了一个变量的名称,并且是一个无可辩驳的匹配!当然,这是无意的,但是对于编译器来说,这是非常有意义的

好消息是,编译器在下一次尝试匹配时就开始抱怨,因此您可以很容易地找出哪个匹配是无可辩驳的

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


此错误有很多变体(请参阅副本),例如,它也可能是由于不正确地导入
enum
而导致的,因此其变体不在范围内。

我不明白为什么
I
是无可辩驳的匹配?什么是无可辩驳的?@MikeVella:无可辩驳的意思是它总是匹配的。由于
i
不是模式(只是绑定),那么无论匹配的变量的内部结构/值是什么,都可以将其绑定到
i
match variable {
    1 => 2,
    i => 2 * i
}