Модули и организация кода

Как организовать растущий код: модули (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 сокращает длинные пути; большие модули выносят в отдельные файлы.
Проверьте себя
1. Какова видимость элементов модуля по умолчанию?
AПубличная
BПриватная — наружу видны только элементы, помеченные pub
CЗависит от типа
DВидимы только в main
2. Что делает ключевое слово use?
AУдаляет модуль
BСоздаёт короткий путь/псевдоним, чтобы не писать полный путь к элементу
CОбъявляет переменную
DЗапускает тест
3. Что означает объявление mod utils; (с точкой с запятой)?
AСоздаёт пустой модуль
BПросит компилятор взять содержимое модуля из файла src/utils.rs
CУдаляет модуль utils
DИмпортирует внешний крейт
Поддержать проект