Пакет, крейт, модуль
Кратко
пакет (package) может содержать не более одного library crate, но может содержать несколько binary crate
module и pub
mod front_of_house { // чтобы другой module мог обратиться к вложенному module, нужен модификатор pub pub mod hosting { // чтобы другой module мог обратиться к этой fn, тоже нужен модификатор pub pub fn add_to_waitlist() {} } // чтобы обратиться к вложенному struct, тоже нужен модификатор pub pub struct Breakfast { // поля struct по умолчанию private; для внешнего доступа тоже нужен pub pub toast: String, seasonal_fruit: String, } impl Breakfast { pub fn summer(toast: &str) -> Breakfast { Breakfast { toast: String::from(toast), seasonal_fruit: String::from("peaches"), } } } } pub fn eat_at_restaurant() { // Absolute path crate::front_of_house::hosting::add_to_waitlist(); // Relative path front_of_house::hosting::add_to_waitlist(); }module и use
// аналог using namespace в C++ mod front_of_house { pub mod hosting { pub fn add_to_waitlist() {} } } use crate::front_of_house::hosting; pub fn eat_at_restaurant() { hosting::add_to_waitlist(); hosting::add_to_waitlist(); hosting::add_to_waitlist(); } // use тоже можно помечать pub — это называется Re-exporting; снаружи можно сразу обращаться hosting::xxx pub use crate::front_of_house::hosting; // use можно сокращать use std::cmp::Ordering; use std::io; use std::{cmp::Ordering, io}; // при сокращении можно использовать self use std::io; use std::io::Write; use std::io::{self, Write}; // можно подключить все module через * use std::collections::*;
при использовании mod a; читается папка/файл a в том же каталоге
Источник
…
Пакет (package) — это один или несколько крейтов, предоставляющих набор функциональности. Пакет содержит файл Cargo.toml, который описывает, как собирать эти крейты.
Есть несколько правил, определяющих, что может содержать пакет. Пакет может содержать не более одного library crate. Он может содержать сколько угодно binary crate, но обязан содержать хотя бы один крейт (library или binary).
…
Разделение модулей по разным файлам
До сих пор все примеры в этой главе определяли несколько модулей в одном файле. Когда модули разрастаются, их определения стоит перенести в отдельный файл, чтобы по коду было легче ориентироваться.
Например, начнём с кода из листинга 7-17 и перенесём модуль front_of_house в собственный файл src/front_of_house.rs, изменив корневой файл крейта так, чтобы в нём был код из листинга 7-21. В этом случае корневой файл крейта — src/lib.rs, но та же процедура работает и для binary crate, где корневой файл — src/main.rs.
Имя файла: src/lib.rs
mod front_of_house;
pub use crate::front_of_house::hosting;
pub fn eat_at_restaurant() {
hosting::add_to_waitlist();
hosting::add_to_waitlist();
hosting::add_to_waitlist();
}
Листинг 7-21: объявление модуля front_of_house, тело которого будет находиться в src/front_of_house.rs
А src/front_of_house.rs получает определения из тела модуля front_of_house, как показано в листинге 7-22.
Имя файла: src/front_of_house.rs
pub mod hosting {
pub fn add_to_waitlist() {}
}
Листинг 7-22: определения внутри модуля front_of_house в src/front_of_house.rs
Точка с запятой после mod front_of_house вместо блока говорит Rust загрузить содержимое модуля из другого файла с тем же именем, что и модуль. Чтобы продолжить пример и вынести модуль hosting тоже в отдельный файл, изменим src/front_of_house.rs так, чтобы там осталось только объявление модуля hosting:
Имя файла: src/front_of_house.rs
pub mod hosting;
Затем создадим каталог src/front_of_house и файл src/front_of_house/hosting.rs с определениями модуля hosting:
Имя файла: src/front_of_house/hosting.rs
pub fn add_to_waitlist() {}
Дерево модулей остаётся прежним, и вызовы функций в eat_at_restaurant будут работать без изменений, хотя определения живут в разных файлах. Этот приём позволяет переносить модули в новые файлы по мере их роста.
Заметим, что выражение pub use crate::front_of_house::hosting в src/lib.rs тоже не изменилось, а use вообще не влияет на то, какие файлы компилируются в составе крейта. Ключевое слово mod объявляет модули, и Rust ищет код этого модуля в файле с тем же именем.