2014-05-22 13 views
7

Tôi gặp phải một thông báo lỗi rất khó hiểu từ trình biên dịch Rust khi sử dụng câu lệnh match.Khó hiểu lỗi mẫu không thể truy cập

enum Name { 
    Known, 
} 

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

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

Trình biên dịch Rust phàn nàn về một mô hình unreachable:

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

Để một con người, lỗi thực sự là Unknown là mất tích từ định nghĩa của Name, đó là dễ dàng hơn để phát hiện khi bạn không có 40 biến thể khác.

Trả lời

5

Đây thực sự là vấn đề đã biết tại thời điểm này; nó không phải là một lỗi thích hợp, mà là một vấn đề chất lượng thực hiện.

Vấn đề nắm để trận đấu không thể chối cãi, tức là .:

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

Dưới đây là một ikhông thể chối cãi trận đấu, có nghĩa là nó luôn trận đấu, bất kể giá trị của variable.


Vâng, chúng tôi có cùng một vấn đề với điều đó báo cáo kỳ lạ: vì Unknown là không rõ, nó trở thành một tên cho một biến trong một không thể chối cãi trận đấu! Dĩ nhiên, nó là vô ý, nhưng nó có ý nghĩa hoàn hảo cho trình biên dịch.

Các tin tốt là trình biên dịch bắt đầu phàn nàn ngay khi tiếp theo trận đấu cố gắng, vì vậy bạn có thể dễ dàng tìm ra trận đấu là không thể chối cãi.

Một phong cách lint is expected sẽ giúp báo cáo Unknown là một biến viết hoa không đúng cách, do đó gạch dưới trình biên dịch không xem nó như là một biến thể enum.

Có rất nhiều biến thể cho lỗi này (xem các bản sao), cũng có thể do nhập sai enum ví dụ và do đó không có biến thể của nó trong phạm vi.

+0

Tôi không hiểu tại sao 'i' là một trận đấu không thể chối cãi? Điều gì là không thể chối cãi về nó? –

+1

@MikeVella: Không thể chối cãi có nghĩa là nó luôn khớp. Và vì 'i' không có mẫu (chỉ là một ràng buộc), thì bất kể cấu trúc bên trong/giá trị nào của biến được so khớp thì sẽ luôn có thể ràng buộc nó thành' i'. –

Các vấn đề liên quan