Разделение кода приложения на отдельные файлы (модули кода) помогает в логической организации функционала вашего приложения, делая код понятнее и удобнее для поддержки. Это становится особенно важным по мере разрастания проекта.
Пошаговое руководство по добавлению модуля кода в приложение Rus:
[Шаг 1: создание файловой структуры для модуля]
Вариант A: модуль с одним файлом
your_project/
├── src/
│ ├── main.rs
│ └── your_module.rs # файл нового модуля
└── Cargo.toml
Вариант B: модуль из нескольких файлов (директория)
your_project/
├── src/
│ ├── main.rs
│ └── your_module/ # директория модуля
│ ├── mod.rs # главный файл модуля
│ └── submodule.rs # дополнительные (не обязательные) субмодули
└── Cargo.toml
[Шаг 2: написание кода модуля]
Для одиночного модуля (src/your_module.rs):
// Публичные функции (доступные снаружи модуля):
pub struct MyStruct {
pub value: i32,
}
impl MyStruct {
pub fn new(value: i32) -> Self {
Self { value }
}
pub fn double(&self) -> i32 {
self.value * 2
}
}
pub fn utility_function() -> String {
"Привет из модуля!".to_string()
}
// Приватная функция (она доступна только в пределах этого модуля):
fn private_helper() {
println!("Это приватная функция");
}
Для модуля директории (src/your_module/mod.rs):
// src/your_module/mod.rs
pub mod submodule; // Декларация субмодулей
pub struct MyStruct {
pub value: i32,
}
impl MyStruct {
pub fn new(value: i32) -> Self {
Self { value }
}
}
[Шаг 3: декларация модуля в основном файле приложения]
В файле src/main.rs:
// Декларация модуля (говорит для Rust искать модуль в your_module.rs
// или в your_module/mod.rs):
mod your_module;
// Импорт элементов из вашего модуля:
use your_module::{MyStruct, utility_function};
fn main() {
// Использование функционала вашего модуля:
let my_instance = MyStruct::new(42);
println!("Значение: {}", my_instance.value);
println!("Удвоенное значение: {}", my_instance.double());
let message = utility_function();
println!("{}", message);
// Вы также можете использовать полный путь для вызова функций модуля:
let another_instance = your_module::MyStruct::new(100);
println!("Другое значение: {}", another_instance.value);
}
[Шаг 4, опциональный: создание субмодулей]
Создайте файл src/your_module/submodule.rs:
pub fn submodule_function() -> &'static str {
"Я в субмодуле!"
}
Обновите src/your_module/mod.rs для экспорта субмодуля:
// src/your_module/mod.rs
pub mod submodule;
pub struct MyStruct {
pub value: i32,
}
// Повторный экспорт элементов субмодуля при необходимости:
pub use submodule::submodule_function;
impl MyStruct {
pub fn new(value: i32) -> Self {
Self { value } }
}
[Шаг 5: использование субмодулей в основной программе]
В src/main.rs:
mod your_module;
// Импорт из основного модуля и субмодуля:
use your_module::{MyStruct, submodule_function, submodule};
fn main() {
let my_instance = MyStruct::new(42);
println!("Значение: {}", my_instance.value);
// Использование повторно экспортированной функции:
println!("{}", submodule_function());
// Или доступ через путь субмодуля:
println!("{}", your_module::submodule::submodule_function());
}
[Шаг 6: организация нескольких модулей]
Для нескольких модулей:
your_project/
├── src/
│ ├── main.rs
│ ├── math/ # модуль математики math
│ │ ├── mod.rs
│ │ ├── calculus.rs
│ │ └── algebra.rs
│ ├── utils/ # модуль утилит utils
│ │ ├── mod.rs
│ │ └── helpers.rs
│ └── models/ # модуль моделей данных models
│ ├── mod.rs
│ └── user.rs
└── Cargo.toml
В главном файле приложения src/main.rs:
// Декларация всех модулей:
mod math;
mod utils;
mod models;
// Импорт определенных элементов модулей:
use math::algebra::add;
use utils::helpers::format_message;
use models::user::User;
fn main() {
let result = add(5, 3);
let message = format_message("Привет");
let user = User::new("Светлана");
println!("Результат: {}", result);
println!("Сообщение: {}", message);
println!("Пользователь: {}", user.name);
}
[Ключевые концепции]
1. mod module_name; - декларирует модуль (Rust ищет module_name.rs или module_name/mod.rs).
2. pub - делает элементы модуля публичными, т. е. доступными вне модуля.
3. use - импорт элементов в текущую область видимости (current scope) кода.
4. Именование файлов - имена модуля должны совпадать с именами файлов.
5. mod.rs - специальный файл, который определяет содержимое модуля, когда для модуля используется директория.
[Общие шаблоны]
Ре-экспорт:
// В вашем your_module/mod.rs:
pub mod submodule;
pub use submodule::important_function; // реэкспорт для упрощения доступа
Приватные модули:
// Модули без 'pub' являются приватными для своего родительского модуля:
mod private_module; // доступен только из этого файла