mod
to deklaracja modułu. Niniejsza dyrektywa deklaruje moduł i całą jego zawartość. Tak się składa, że te treści mogą znajdować się w innym pliku. Więc tak:
mod game;
mod matrix;
odpowiada w przybliżeniu następująco:
mod game {
// game.rs contents
}
mod matrix {
// matrix.rs contents
}
Naturalnie, ponieważ mod
jest deklaracja modułu, nie można zrobić to kilka razy do tego samego modułu. Oznacza to, że można spróbować i napisać coś podobnego
mod game {
mod matrix;
...
}
mod matrix;
ale, jak widać, matrix
i game::matrix
są różne moduły i naturalnie rustc wymaga różne ścieżki do swoich plików, jeśli są zewnętrzne.
use
, jednakże jest to deklaracja importu. use
deklaracje pobierają nazwy z innych modułów do wykorzystania w bieżącym module. Z dowolnego miejsca tego modułu można korzystać z dowolnego modułu i dowolnych publicznych elementów z dowolnej liczby razy.
Tak, aby odwoływać matrix
z game
trzeba go use
:
// game.rs
use matrix;
Oczywiście, aby to zadziałało matrix
powinny zostać uznane ze mod
w korzeniu skrzyni.
Osobiście uważam, że najprostszym sposobem zrozumienia systemu modułów Rust jest zapominanie, że moduły można w ogóle umieścić w różnych plikach. Oznacza to, że jakaś skrzynia może być zdefiniowana tylko w jednym pliku. Rust mod
dyrektyw może mieć ciała i może gniazdo, tak zagnieżdżone mod
s faktycznie zdefiniować system moduł skrzyni:
mod foo {
mod bax {
...
}
mod baz {
...
}
}
mod bar {
mod qux {
mod zux {
...
}
}
}
Jeśli masz tylko jeden plik, można łatwo zobaczyć, jak mod
i use
dyrektyw będzie działać , a związek między modułami powinien stać się jasny.
A teraz tylko trzeba dodać do obrazu fakt, że jeśli moduł jest zadeklarowana bez ciała, jak w mod name;
, jego zawartość jest załadowany albo z name.rs
lub name/mod.rs
, co jest dostępne. Jednak pełny obraz nie zmienia się w najmniejszym stopniu - nadal są to moduły zagnieżdżone, które mogą być zawsze reprezentowane jako pojedynczy plik źródłowy z zagnieżdżonymi dyrektywami mod
. W rzeczywistości, cargo rustc -Z unstable-options --pretty=normal
wydrukuje twoją skrzynię w tym formularzu, po tym jak wszystkie moduły w zewnętrznych plikach źródłowych zostaną połączone w jeden dokument. Sugeruję uruchomienie tego polecenia na niektórych skrzyniach z rozbudowaną strukturą modułów, aby zobaczyć, jak to wygląda w praktyce.
Spójrz na [tę odpowiedź] (http://stackoverflow.com/a/22597760/994206). Jest to również omówione w [samouczek] (http://static.rust-lang.org/doc/master/book/crates-and-modules.html) – Mokosha