在使用 Rust 编译器时,我遇到了一条非常令人困惑的错误消息match
陈述。
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,
| ^^^^^^^
To a human,真正的错误是Unknown
的定义中缺少Name
,当您还没有 40 个其他变体时,更容易发现。
这实际上是目前的一个已知问题;这不是一个错误,而是一个实施质量问题。
问题归结为无可辩驳的匹配, i.e.:
match variable {
1 => 2,
i => 2 * i
}
Here i
is an 无可辩驳的匹配,意思是always匹配,无论值variable
.
好吧,我们对那个奇怪的报告有同样的问题:因为Unknown
未知,它成为变量中的名称无可辩驳的匹配!当然,这是无意的,但对于编译器来说却非常有意义。
好消息是编译器一旦开始抱怨next尝试匹配,这样您就可以轻松找到which比赛是无可辩驳的。
风格棉绒是期待 https://github.com/mozilla/rust/issues/3070这将有助于解决这个问题,它将报告Unknown
是一个大小写不正确的变量,因此强调编译器不会将其视为枚举变体。
此错误有很多变体(请参阅重复项),它也可能是由于不正确地导入enum
例如,因此在范围内没有其变体。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)