Модули
Syntax
Module →
unsafe? mod IDENTIFIER ;
| unsafe? mod IDENTIFIER {
InnerAttribute*
Item*
}
Модуль - это контейнер для нуля или более элементов.
Элемент модуля - это модуль, окружённый фигурными скобками, имеющий имя и предваренный
ключевым словом mod. Элемент модуля вводит новый именованный модуль в дерево
модулей, составляющих крейт.
Модули могут быть вложенными произвольным образом.
Пример модуля:
#![allow(unused)] fn main() { mod math { type Complex = (f64, f64); fn sin(f: f64) -> f64 { /* ... */ unimplemented!(); } fn cos(f: f64) -> f64 { /* ... */ unimplemented!(); } fn tan(f: f64) -> f64 { /* ... */ unimplemented!(); } } }
Модули определяются в пространстве имён типов модуля или блока, где они находятся.
Ошибкой является определение нескольких элементов с одинаковым именем в одном пространстве имён внутри модуля. См. главу об областях видимости для получения дополнительной информации об ограничениях и поведении затенения.
Ключевое слово unsafe синтаксически разрешено появляться перед ключевым словом mod,
но оно отклоняется на семантическом уровне. Это позволяет макросам потреблять
синтаксис и использовать ключевое слово unsafe, прежде чем удалить его из
потока токенов.
Имена файлов исходного кода модулей
Модуль без тела загружается из внешнего файла. Когда модуль не имеет
атрибута path, путь к файлу отражает логический путь модуля.
Компоненты пути родительских модулей являются каталогами, а содержимое модуля
находится в файле с именем модуля и расширением .rs.
Например, следующая структура модулей может иметь соответствующую
структуру файловой системы:
| Путь модуля | Путь в файловой системе | Содержимое файла |
|---|---|---|
crate | lib.rs | mod util; |
crate::util | util.rs | mod config; |
crate::util::config | util/config.rs |
Имена файлов модулей также могут быть именем модуля как каталога с
содержимым в файле с именем mod.rs внутри этого каталога. Вышеприведенный пример может
также быть выражен с содержимым crate::util в файле с именем
util/mod.rs. Не допускается наличие одновременно util.rs и util/mod.rs.
Note
До
rustc1.30 использование файловmod.rsбыло способом загрузки модуля с вложенными дочерними элементами. Рекомендуется использовать новое соглашение об именовании, так как оно более последовательно и позволяет избежать наличия многих файлов с именемmod.rsв проекте.
Атрибут path
Каталоги и файлы, используемые для загрузки внешних файлов модулей, могут быть
изменены с помощью атрибута path.
Для атрибутов path на модулях, не находящихся внутри встроенных блоков модулей, путь к файлу
относится к каталогу, в котором находится исходный файл. Например, следующий
фрагмент кода будет использовать пути, показанные в зависимости от его расположения:
#[path = "foo.rs"]
mod c;
| Исходный файл | Расположение файла c | Путь модуля c |
|---|---|---|
src/a/b.rs | src/a/foo.rs | crate::a::b::c |
src/a/mod.rs | src/a/foo.rs | crate::a::c |
Для атрибутов path внутри встроенных блоков модулей относительное расположение
пути к файлу зависит от типа исходного файла, в котором находится
атрибут path. Исходные файлы “mod-rs” - это корневые модули (такие как lib.rs или
main.rs) и модули с файлами с именем mod.rs. Исходные файлы “non-mod-rs” - это
все остальные файлы модулей. Пути для атрибутов path внутри встроенных блоков модулей
в файле mod-rs являются относительными к каталогу файла mod-rs,
включая компоненты встроенного модуля как каталоги. Для файлов non-mod-rs
всё то же самое, за исключением того, что путь начинается с каталога с именем
модуля non-mod-rs. Например, следующий фрагмент кода будет использовать пути,
показанные в зависимости от его расположения:
mod inline {
#[path = "other.rs"]
mod inner;
}
| Исходный файл | Расположение файла inner | Путь модуля inner |
|---|---|---|
src/a/b.rs | src/a/b/inline/other.rs | crate::a::b::inline::inner |
src/a/mod.rs | src/a/inline/other.rs | crate::a::inline::inner |
Пример комбинирования вышеуказанных правил атрибутов path на встроенных модулях
и вложенных модулей внутри (применяется к файлам как mod-rs, так и non-mod-rs):
#[path = "thread_files"]
mod thread {
// Загружает модуль `local_data` из `thread_files/tls.rs` относительно
// каталога этого исходного файла.
#[path = "tls.rs"]
mod local_data;
}
Атрибуты на модулях
Модули, как и все элементы, принимают внешние атрибуты. Они также принимают внутренние
атрибуты: либо после { для модуля с телом, либо в начале
исходного файла, после опциональной BOM и шебанга.
Встроенные атрибуты, которые имеют смысл для модуля: cfg,
deprecated, doc, атрибуты проверки линтов, path и
no_implicit_prelude. Модули также принимают атрибуты макросов.