Postępując zgodnie z tym przewodnikiem stworzyłem projekt Cargo.
src/main.rs
fn main() {
hello::print_hello();
}
mod hello {
pub fn print_hello() {
println!("Hello, world!");
}
}
z których korzystam
cargo build && cargo run
i kompiluje się bez błędów. Teraz próbuję podzielić główny moduł na dwie części, ale nie mogę dowiedzieć się, jak dołączyć moduł z innego pliku.
Moje drzewo projektów wygląda tak
├── src
├── hello.rs
└── main.rs
oraz zawartość 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ę to cargo build
, otrzymuję
error[E0432]: unresolved import `hello`
--> src/main.rs:1:5
|
1 | use hello;
| ^^^^^ no `hello` external crate
Próbowałem postępować zgodnie z sugestiami kompilatora i zmodyfikowałem main.rs
do:
#![feature(globs)]
extern crate hello;
use hello::*;
fn main() {
hello::print_hello();
}
Ale to nadal niewiele pomaga, teraz rozumiem:
error[E0463]: can't find crate for `hello`
--> src/main.rs:3:1
|
3 | extern crate hello;
| ^^^^^^^^^^^^^^^^^^^ can't find crate
Czy istnieje trywialny przykład, jak dołączyć jeden moduł z bieżącego projektu do głównego pliku projektu?
Odpowiedzi:
Nie potrzebujesz
mod hello
w swoimhello.rs
pliku. Kod w dowolnym pliku oprócz katalogu głównego skrzynki (main.rs
dla plików wykonywalnych,lib.rs
dla bibliotek) jest automatycznie przydzielany do przestrzeni nazw w module.Aby dołączyć kod z
hello.rs
do swojegomain.rs
, użyjmod hello;
. Jest rozwijany do kodu, który jest whello.rs
(dokładnie tak, jak miałeś wcześniej). Twoja struktura plików jest taka sama, a kod wymaga niewielkiej zmiany:main.rs
:hello.rs
:źródło
use
jest po prostu przestrzenią nazw, podczas gdymod
ściąga plik. Możeszuse
na przykład użyć , aby móc wywołaćprint_hello
funkcję bez konieczności poprzedzania przestrzenią nazwJeśli chcesz mieć zagnieżdżone moduły ...
Rdza 2018
Nie jest już wymagane posiadanie pliku
mod.rs
(chociaż nadal jest obsługiwany). Idiomatyczną alternatywą jest nazwanie pliku nazwą modułu:main.rs
my.rs
Rdza 2015
Musisz umieścić
mod.rs
plik w swoim folderze o tej samej nazwie co twój moduł. Rust by Example wyjaśnia to lepiej.main.rs
mod.rs
źródło
inaccessible.rs
wnested.rs
... w jaki sposób to zrobić?#[path = "inaccessible.rs"]
a w następnym wierszu:mod inaccessible;
mod inaccessible;
do,my/mod.rs
aby uczynić go podmodułem zmy
, a następnie uzyskaj dostęp do modułu rodzeństwa zanested.rs
pomocą ścieżki względnejsuper::inaccessible::function()
. nie potrzebujeszpath
tutaj atrybutu.Bardzo podoba mi się odpowiedź Gardenera. Korzystałem z sugestii dla moich deklaracji modułów. Niech ktoś zadzwoni, jeśli jest z tym problem techniczny.
main.rs
utils / thing.rs
other_utils / other_thing.rs
źródło
fn
pod taką samą nazwą, jak plik, w którym się znajdował.#[path = "./add_offer.rs"] mod _add_offer; pub use self::_add_offer::add_offer;