2014-05-22 39 views
7

当使用match语句时,我遇到了来自Rust编译器的非常混淆的错误消息。混淆不可达模式错误

enum Name { 
    Known, 
} 

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

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

锈病编译器会抱怨无法访问的模式:

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种变种。

回答

5

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

问题归结为无可辩驳的比赛,即:

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

这里i是一个无可辩驳的比赛,这意味着它总是比赛不管的variable值。


好了,我们有同样的问题与怪异的报告:因为Unknown是未知的,它在无可辩驳的比赛成为一个名称为变量!当然这不是意想不到的,但它对编译器来说非常合理。

好消息是,编译器将立即开始在下一个试图匹配抱怨,这样你就可以很容易地找到比赛是无可辩驳的。

风格皮棉is expected这将有助于在这个问题上,它会报告Unknown是一个不正确的大写变量,从而强调编译器不会看到它作为一个枚举变体。

这个bug有很多变种(见重复),它也可能是由于例如不正确地导入了一个enum而导致的,因此没有在其范围内变体。

+0

我不明白为什么'我'是一个无可辩驳的匹配?什么是无可辩驳的呢? –

+1

@MikeVella:无可辩驳意味着它总是匹配。由于'i'不是模式(只是一个绑定),因此无论被匹配的变量的内部结构/值如何,它总是可以将它绑定到'i'。 –