2013-06-27 17 views
5

Sto cercando di capire come compilare casse multi-file in Rust, ma continuo a ricevere un errore di compilazione.Come si compila una cassa multi-file in Rust?

ho il file che voglio importare nella thing.rs cassa:

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

E il mio file di cassa Test.rc:

mod thing; 

use thing::asdf::*; 

fn main(){ 

} 

Quando eseguo ruggine accumulo Test.rc 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 

C'è ovviamente qualcosa di semplice su come funzionano i moduli, le casse e l'uso che non sto ottenendo. La mia comprensione era quel mod qualcosa; per i file nella stessa directory o extern mod qualcosa; per le librerie sul percorso della libreria ha causato il collegamento del file oggetto. Quindi utilizzare consentirebbe di importare parti del modulo nel file, funzione o modulo corrente. Questo sembra funzionare per cose nella libreria principale.

Questo è con la versione 0.6 del compilatore di ruggine.

risposta

8

Hai solo bisogno di mettere il use nella parte superiore del file:

use thing::asdf::*; 

mod thing; 

fn main() {} 

Questo sembra molto strano, ma

  1. E 'quello che il messaggio di errore dice (tutto ciò che si può mettere a il livello superiore che non è use o extern mod è un "articolo", compresi mod s) e
  2. È come funziona la risoluzione dei nomi di Rust. use è sempre relativo alla parte superiore della cassa e l'intera cassa viene caricata prima che si verifichi la risoluzione dei nomi, quindi use thing::asdf::*; fa apparire a ruggine thing come un sottomodulo della cassa (che trova), quindi asdf come sottomodulo di quella, ecc

Per illustrare questo ultimo punto migliore (e dimostrare i due nomi speciali in use, super e self, che importano direttamente dal genitore e modulo corrente, rispettivamente):

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

(Inoltre, tangenzialmente, loL'estensione del filenon ha più alcun significato speciale per gli strumenti Rust (incluso in 0.6) ed è deprecata, ad es. tutti i file .rc nell'albero dei sorgenti del compilatore sono stati recentemente rinominati in .rs.)

Problemi correlati