2013-06-27 19 views
5

Tôi đang cố gắng tìm ra cách biên dịch các thùng chứa nhiều tệp trong Rust, nhưng tôi vẫn gặp phải lỗi biên dịch.Làm cách nào để biên dịch một tập tin đa tệp trong Rust?

Tôi có tập tin tôi muốn nhập khẩu vào thing.rs thùng:

mod asdf { 
    pub enum stuff { 
     One, 
     Two, 
     Three 
    } 
} 

Và tập thùng của tôi test.rc:

mod thing; 

use thing::asdf::*; 

fn main(){ 

} 

Khi tôi chạy gỉ xây dựng test.rc tôi get:

test.rc:3:0: 3:19 error: `use` and `extern mod` declarations must precede items 
test.rc:3 use thing::asdf::*; 
      ^~~~~~~~~~~~~~~~~~~ 
error: aborting due to previous error 

Rõ ràng là có điều gì đó đơn giản về cách mô-đun, thùng và sử dụng công việc mà tôi không nhận được. Sự hiểu biết của tôi là mod một cái gì đó; cho các tập tin trong cùng một thư mục hoặc extern mod một cái gì đó; cho các thư viện trên đường dẫn thư viện khiến tệp đối tượng được liên kết. Sau đó, sử dụng sẽ cho phép bạn nhập các phần của mô-đun vào tệp, hàm hoặc mô-đun hiện tại. Điều này dường như làm việc cho các công cụ trong thư viện cốt lõi.

Đây là phiên bản 0.6 của trình biên dịch gỉ.

Trả lời

8

Bạn chỉ cần đặt use ở phía trên cùng của tập tin:

use thing::asdf::*; 

mod thing; 

fn main() {} 

này trông rất lạ, nhưng

  1. Đó là những gì được thông báo lỗi nói (bất cứ điều gì mà bạn có thể đặt tại cấp cao nhất không phải là use hoặc extern mod là một "mục", bao gồm mod s) và
  2. Đó là cách thức hoạt động của độ phân giải tên Rust. use luôn luôn tương đối so với đỉnh thùng, và toàn bộ thùng được nạp trước khi độ phân giải tên xảy ra, vì vậy use thing::asdf::*; làm cho rustc tìm kiếm thing như một mô-đun nhỏ của thùng (mà nó tìm thấy), và sau đó là asdf như một mô-đun con, vv

Để minh họa điểm cuối cùng này tốt hơn (và chứng minh hai tên đặc biệt trong use, superself, mà nhập khẩu trực tiếp từ cha mẹ và module hiện hành tương ứng):

// crate.rs 

pub mod foo { 
    // use bar::baz; // (an error, there is no bar at the top level) 

    use foo::bar::baz; // (fine) 
    // use self::bar::baz; // (also fine) 

    pub mod bar { 
     use super::qux; // equivalent to 
     // use foo::qux; 

     pub mod baz {} 
    } 
    pub mod qux {} 
} 

fn main() {} 

(Ngoài ra, tiếp tuyến, sốPhần mở rộng tệpkhông còn bất kỳ ý nghĩa đặc biệt nào đối với bất kỳ công cụ Rust nào (kể cả trong 0.6) và không được dùng nữa, ví dụ: tất cả các tệp .rc trong cây nguồn trình biên dịch gần đây đã được đổi tên thành .rs.)