2014-05-22 13 views
7

Podczas korzystania z instrukcji match napotkałem bardzo mylący komunikat o błędzie z kompilatora Rust.Mylące nieosiągalny błąd wzorca

enum Name { 
    Known, 
} 

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

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

Rust kompilator narzeka nieosiągalnego wzoru:

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, 
    |   ^^^^^^^ 

Do ludzka, prawdziwy błąd to, że Unknown brakuje definicji Name, który jest łatwiejszy do wykrycia kiedy nie masz jeszcze 40 innych wariantów.

Odpowiedz

5

Jest to obecnie znany problem; nie jest to błąd właściwy, ale raczej problem z jakością implementacji.

Kwestia sprowadza się do niepodważalnych meczów, tj .:

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

Tutaj i jest niepodważalne mecz, co oznacza, że ​​zawsze mecze, bez względu na wartość od variable.


Cóż, mamy ten sam problem z tym raporcie dziwne: bo Unknown jest nieznane, staje się nazwę zmiennej w niepodważalny meczu! Jest to oczywiście niezamierzone, ale ma sens dla kompilatora.

Dobrą wiadomością jest to, że kompilator skarży zacznie jak tylko obok usiłowanie meczu, dzięki czemu można łatwo dowiedzieć się który mecz niepodważalne.

Skarpety w stylu is expected, które pomogłyby w tym problemie, zgłosiłoby, że Unknown jest niewłaściwie skapitalizowaną zmienną, co podkreśla, że ​​kompilator nie postrzega go jako wariant wyliczeniowy.

Istnieje wiele odmian tego błędu (zobacz duplikaty), może to być również spowodowane nieprawidłowym importowaniem np. enum, a tym samym braku jego wariantów w zakresie.

+0

Nie rozumiem, dlaczego "i" jest niezastąpionym odpowiednikiem? Co jest niepodważalne w tej kwestii? –

+1

@MikeVella: Niezastąpiony oznacza, że ​​zawsze pasuje. A ponieważ 'i' nie jest wzorcem (tylko wiązaniem), to niezależnie od wewnętrznej struktury/wartości dopasowywanej zmiennej, zawsze będzie można powiązać ją z' i'. –

Powiązane problemy