2014-05-22 57 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'。 –