2014-10-15 14 views
44

Postępując this guide stworzyłem projekt cargoJak dołączyć moduł z innego pliku z tego samego projektu?

src/main.rs

fn main() { 
    hello::print_hello(); 
} 

mod hello { 
    pub fn print_hello() { 
     println!("Hello, world!"); 
    } 
} 

które pracuje z wykorzystaniem

cargo build && cargo run 

i kompiluje bez błędów. Teraz próbuję podzielić główny moduł na dwie części, ale nie mogę wymyślić, jak dołączyć moduł z innego pliku.

Moje drzewo projekt wygląda tak

├── src 
   ├── hello.rs 
   └── main.rs 

i zawartości plików:

src/main.rs

use hello; 

fn main() { 
    hello::print_hello(); 
} 

src/hello.rs

mod hello { 
    pub fn print_hello() { 
     println!("Hello, world!"); 
    } 
} 

Kiedy kompiluję go z cargo build uzyskać

modules/src/main.rs:1:5: 1:10 error: unresolved import (maybe you meant `hello::*`?) 
modules/src/main.rs:1 use hello; 
                ^~~~~ 
error: aborting due to previous error 
Could not compile `modules`. 

Starałem się śledzić propozycje kompilator i zmodyfikowane main.rs do

#![feature(globs)] 

extern crate hello; 

use hello::*; 

fn main() { 
    hello::print_hello(); 
} 

ale to nadal nie pomogło, teraz mogę to

modules/src/main.rs:3:1: 3:20 error: can't find crate for `hello` 
modules/src/main.rs:3 extern crate hello; 
               ^~~~~~~~~~~~~~~~~~~ 
error: aborting due to previous error 
Could not compile `modules`. 

Czy istnieje prosty przykład włączenia jednego modułu z bieżącego projektu do głównego pliku projektu?

Ponadto używam Rust 0.13.0-nightly i ładunek 0.0.1-pre-nightly.

+1

możliwe duplikat [PODSTAWOWE importu Rust (zawiera)] (http://stackoverflow.com/questions/26224947/rust-basic-imports-includes) – Levans

+0

Związane z http://stackoverflow.com/questions/22596920/split-a-module-across-several-files – Kelvin

Odpowiedz

89

Nie potrzebujesz pliku mod hello w swoim pliku . Kod dla dowolnego pliku, ale katalog główny skrzynki (main.rs dla plików wykonywalnych, lib.rs dla bibliotek) jest automatycznie nazwany w module.

Aby uwzględnić kod z hello.rs na swoim main.rs, użyj mod hello;. Zostaje rozwinięty do kodu, który jest na hello.rs (dokładnie tak, jak przedtem). Twoja struktura plików nadal taka sama, a kod musi zostać nieco zmienione:

main.rs:

mod hello; 

fn main() { 
    hello::print_hello(); 
} 

hello.rs:

pub fn print_hello() { 
    println!("Hello, world!"); 
} 
+0

Późne pytanie nie działa również, jeśli określę to przy użyciu witaj zamiast mod hello ?! –

+4

@ChristianSchmitt Nie, to są różne rzeczy. 'use' to po prostu przestrzeń nazw, podczas gdy' mod' ściąga plik. Możesz użyć 'use', na przykład, aby móc wywołać funkcję' print_hello' bez konieczności poprzedzania prefiksem obszaru nazw –

+0

To mi pomogło. +1 i dzięki. –

Powiązane problemy