Дерево модулей
Если не писать содержимое модуля, Rust будет искать его в другом файле:
// Copyright 2022 Google LLC
// SPDX-License-Identifier: Apache-2.0
mod garden;
Это сообщает Rust, что содержимое модуля garden находится в файле garden.rs в том же каталоге, что и файл, объявивший модуль. Если модуль garden аналогично объявляет подмодуль vegetables, его содержимое будет находиться в garden/vegetables.rs.
Корень крейта находится в:
src/lib.rs(для библиотечного крейта)src/main.rs(для бинарного крейта)
Это отправная точка, с которой компилятор определяет дополнительные модули.
Модули, определённые в файлах, тоже можно документировать с помощью «внутренних doc-комментариев». Они документируют элемент, который их содержит, в данном случае — модуль.
// Copyright 2022 Google LLC
// SPDX-License-Identifier: Apache-2.0
//! Этот модуль реализует сад, включая высокопроизводительную
//! реализацию прорастания семян.
// Объявляем подмодули.
mod plant;
mod seeds;
// Реэкспортируем типы из этого модуля.
pub use plant::Plant;
pub use seeds::SeedPacket;
pub struct Garden {
plants: Vec<Plant>,
}
/// Сеет заданные пакеты семян.
pub fn sow(seeds: Vec<SeedPacket>) {
todo!()
}
/// Собирает готовые к сбору овощи и фрукты в саду.
pub fn harvest(garden: &mut Garden) {
todo!()
}
-
До Rust 2018 модули нужно было размещать в
module/mod.rs, а не вmodule.rs, и это по-прежнему рабочий вариант для редакций после 2018 года. -
Основная причина ввести
filename.rsкак альтернативуfilename/mod.rsв том, что много файлов с именемmod.rsможет быть трудно различить в IDE. -
Для более глубокой вложенности можно использовать каталоги, даже если главный модуль — файл:
src/ ├── main.rs ├── top_module.rs └── top_module/ └── sub_module.rs -
Место, где Rust будет искать модули, можно изменить с помощью директивы компилятора:
// Copyright 2022 Google LLC // SPDX-License-Identifier: Apache-2.0 #[path = "some/path.rs"] mod some_module;Это полезно, например, если вы хотите поместить тесты модуля в файл с именем
some_module_test.rs, по аналогии с соглашением в Go.