使用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种变体时更容易发现
答案 0 :(得分:7)
这实际上是目前已知的问题;它不是一个适当的错误,而是一个实施质量问题。
问题归结为无可辩驳的匹配,即:
match variable {
1 => 2,
i => 2 * i
}
此处i
是无可辩驳的匹配,意味着始终匹配,无论variable
的值是什么。
好吧,我们对这个奇怪的报告也有同样的问题:因为Unknown
未知,所以它成为无可辩驳的匹配中变量的名称!当然,这是无意的,但它对编译器来说非常有意义。
好消息是,一旦 next 尝试匹配,编译器就会开始抱怨,因此您可以轻松找到哪个匹配是无可辩驳的。
样式lint is expected可以帮助解决这个问题,它会将Unknown
报告为一个不正确的大写变量,从而强调编译器不会将其视为枚举变体。
此错误有很多变化(请参阅重复项),也可能是由于导致enum
导入不正确而导致其变体范围不正确。