2013-06-27 8 views
5

Ich versuche herauszufinden, wie man Multi-Datei-Kisten in Rust kompiliert, aber ich bekomme immer einen Kompilierungsfehler.Wie kompiliere ich eine Kiste mit mehreren Dateien in Rust?

Ich habe die Datei möchte ich in die Kiste thing.rs importieren:

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

Und meine Kiste Datei test.rc:

mod thing; 

use thing::asdf::*; 

fn main(){ 

} 

Wenn ich laufen Rost bauen test.rc I erhalten:

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 

Es ist natürlich etwas einfach, wie Module, Kisten und Nutzung der Arbeit, die ich einfach nicht bekommen. Mein Verständnis war das Mod etwas; für Dateien im selben Verzeichnis oder extern Mod etwas; Bei Bibliotheken im Bibliothekspfad wurde die Objektdatei verknüpft. Dann können Sie Teile des Moduls in die aktuelle Datei, Funktion oder das Modul importieren. Dies scheint für Dinge in der Kernbibliothek zu funktionieren.

Dies ist mit Version 0.6 des Rost-Compilers.

Antwort

8

Sie müssen nur die use am Anfang der Datei setzen:

use thing::asdf::*; 

mod thing; 

fn main() {} 

Dieses sehr seltsam aussieht, aber

  1. Es ist, was die Fehlermeldung sagt (alles, was man sich setzen kann die oberste Ebene, die nicht use oder extern mod ist, ist ein "Element", einschließlich mod s) und
  2. Es ist, wie Rust Namensauflösung funktioniert. use ist immer relativ zu der Oberseite der Kiste, und die ganze Kiste wird geladen, bevor Namensauflösung geschieht, so use thing::asdf::*; macht Rustc suchen nach thing als Submodul der Kiste (die es findet), und dann asdf als Submodul davon,
  3. usw.

Um diesen letzten Punkt illustrieren besser (und zeigt die zwei speziellen Namen in use, super und self, die direkt aus den übergeordneten importieren und Strommodul bzw.):

// 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() {} 

(auch tangential, die .rc Dateierweiterung hat keine spezielle Bedeutung mehr für alle Rust-Tools (einschließlich in 0.6) und ist veraltet, z. Alle .rc Dateien in der Compiler-Quellstruktur wurden kürzlich in .rs umbenannt.)

Verwandte Themen