2013-06-27 11 views
5

Próbuję dowiedzieć się, jak skompilować wiele skrzynek plików w Rust, ale wciąż dostaję błąd kompilacji.Jak skompilować skrzynkę z wieloma plikami w Rust?

Mam plik chcę zaimportować do thing.rs skrzyni:

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

A mój plik paka test.rc:

mod thing; 

use thing::asdf::*; 

fn main(){ 

} 

Kiedy biegnę rdzy build test.rc I otrzymujemy:

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 

jest oczywiście coś prostego, jak moduły, klatki i wykorzystanie pracy, że jestem po prostu nie dostaję. Moje zrozumienie było czymś mod; dla plików w tym samym katalogu lub extern coś mod; dla bibliotek w ścieżce do biblioteki spowodował połączenie pliku obiektu. Następnie użycie pozwoliłoby zaimportować części modułu do bieżącego pliku, funkcji lub modułu. To wydaje się działać dla rzeczy w bibliotece rdzenia.

Jest to z wersją 0.6 kompilatora z rdzą.

Odpowiedz

8

Wystarczy umieścić use na początku pliku:

use thing::asdf::*; 

mod thing; 

fn main() {} 

To wygląda bardzo dziwnie, ale

  1. To co się komunikat o błędzie mówi (wszystko, co można umieścić w najwyższy poziom, który nie jest use lub extern mod, jest "elementem", w tym mod s), i
  2. W ten sposób działa rozpoznawanie nazw rdzy. use jest zawsze względna względem górnej części skrzynki, a cała skrzynia jest ładowana przed rozpoznaniem nazwy, więc use thing::asdf::*; powoduje, że rustc wygląda na thing jako moduł częściowy skrzyni (który znajduje), a następnie asdf jako moduł częściowy tego, itp

Aby zilustrować ten ostatni punkt lepsze (i wykazywać dwa specjalne nazwy w use, super i self, które importować bezpośrednio od rodzica i moduł obecnego odpowiednio):

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

(również stycznie,Rozszerzenie plikunie ma już żadnego specjalnego znaczenia dla narzędzi Rust (w tym w wersji 0.6) i jest przestarzałe, np. wszystkie pliki .rc w drzewie źródłowym kompilatora zostały ostatnio zmienione na .rs.)

Powiązane problemy