2014-11-20 30 views
5

Các nhà xây dựng enum được xác định trong cùng một tệp không còn giải quyết.lỗi enum: tên chưa được giải quyết

enum Mode { 
    Global, 
    Local, 
} 

fn which_mode() -> Mode { 
    Global 
} 

fn main() { 
    match which_mode() { 
     Global => println!("Global"), 
     Local => println!("Local"), 
    } 
} 

Trình biên dịch đưa ra một thông báo lỗi "chưa được giải quyết tên Global" trong hàm which_mode. Khi tôi đủ điều kiện nó như là Mode::Global, nó hoạt động. Bây giờ, nó nghĩ rằng các Global trong tuyên bố match là một ràng buộc, và do đó không thể chối cãi!

Hành vi này gần đây - đêm của ngày 11 tháng 11 đã biên dịch thành công mã trên. Với hành vi hiện tại này là như thế nào, tại sao phải làm như vậy Some, Ok, vv không cần đường dẫn đủ điều kiện?

Trả lời

4

Khi bạn nhận thấy, very recently, enums thay đổi thành có variants scoped with their type name.

Các thư viện chuẩn có explicit reexports of the variants vì vậy họ sẵn liền kề với các loại (ví dụ cho ví dụ chính xác liên kết có core::option::None là một bí danh cho core::option::Option::None), đó là lý do họ đang có sẵn không đủ tiêu chuẩn trong mô-đun của họ.

Tuy nhiên, có một mẹo ở đây: None, Some, Err, Ok chỉ có sẵn theo mặc định vì they are in khúc dạo đầu, được nhập khẩu theo mặc định vào mỗi mô-đun. Đó là, các thay đổi không gian tên đã không thay đổi tại sao những biến thể đó không cần đủ điều kiện trong hầu hết mã Rust.

+0

Thực tế, tôi mất vài phút để hiểu rằng Rust đang xử lý 'Toàn cầu' trong' trận đấu' như một ràng buộc. Đôi khi tôi muốn Rust phân biệt (_a la_ Erlang, nhưng ngược lại trong chi tiết cụ thể) giữa ** ban đầu ** chữ thường so với chữ thường của tên khi cố gắng ràng buộc: chữ hoa nghĩa là enum (không ràng buộc); chữ thường có nghĩa là ràng buộc. –

+0

Tôi phải đối mặt với cùng một lỗi tôi không thể hiểu từ tài liệu hướng dẫn làm thế nào để có được ví dụ của sigma.ml để làm việc. Làm thế nào để làm điều đó? –

+0

@AlexanderSupertramp: Để thực hiện công việc ví dụ, vui lòng đủ điều kiện ** tất cả ** trường hợp 'enum'. Thay đổi 'Global' thành' Mode :: Global' và 'Local' thành' Mode :: Local'. Điều quan trọng là phải thay đổi ** tất cả ** lần xuất hiện. –

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