Модули и организация кода
Как организовать растущий код: модули (mod) внутри крейта и видимость через pub.
Модуль (mod) — способ сгруппировать связанный код и управлять его видимостью внутри крейта.
Крейты и модули
Крейт (crate) — единица компиляции в Rust: ваш проект целиком. Внутри крейта код делят на модули — это как папки и пространства имён. Модуль объявляют словом mod.
mod math {
// по умолчанию всё в модуле приватно;
// pub делает функцию доступной снаружи
pub fn square(x: i32) -> i32 {
x * x
}
fn secret() -> i32 { 42 } // приватная: видна только внутри math
}
fn main() {
// обращаемся через путь с ::
println!("{}", math::square(5));
}Вывод:
25
Видимость: приватно по умолчанию
Ещё одно проявление философии безопасности: внутри модуля всё приватно по умолчанию. Чтобы открыть элемент наружу, его помечают pub. Так модуль явно решает, что является его публичным интерфейсом, а что — внутренней реализацией.
Вложенные модули и use
Модули вкладываются друг в друга, образуя дерево. Чтобы не писать длинные пути, подключают имя через use — это создаёт короткий псевдоним в текущей области.
mod shapes {
pub mod circle {
pub fn area(r: f64) -> f64 {
3.14159 * r * r
}
}
}
use shapes::circle;
fn main() {
println!("{:.2}", circle::area(2.0)); // вместо shapes::circle::area
}Вывод:
12.57
Разнесение по файлам
Когда модуль разрастается, его выносят в отдельный файл. Объявление mod utils; (с точкой с запятой, без тела) говорит компилятору искать содержимое в файле src/utils.rs. Структура проекта обычно такая:
src/
main.rs # тут: mod utils; и use crate::utils::...;
utils.rs # содержимое модуля utils
models/
mod.rs # подмодуль modelsПуть crate:: означает «от корня текущего крейта» — так обращаются к модулям из любого места проекта.
Итог
- Крейт — весь проект; модули (
mod) группируют код и задают пространства имён. - Всё приватно по умолчанию;
pubоткрывает элемент как часть публичного интерфейса. useсокращает длинные пути; большие модули выносят в отдельные файлы.