Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Модули

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. Например, следующая структура модулей может иметь соответствующую структуру файловой системы:

Путь модуляПуть в файловой системеСодержимое файла
cratelib.rsmod util;
crate::utilutil.rsmod config;
crate::util::configutil/config.rs

Имена файлов модулей также могут быть именем модуля как каталога с содержимым в файле с именем mod.rs внутри этого каталога. Вышеприведенный пример может также быть выражен с содержимым crate::util в файле с именем util/mod.rs. Не допускается наличие одновременно util.rs и util/mod.rs.

Note

До rustc 1.30 использование файлов mod.rs было способом загрузки модуля с вложенными дочерними элементами. Рекомендуется использовать новое соглашение об именовании, так как оно более последовательно и позволяет избежать наличия многих файлов с именем mod.rs в проекте.

Атрибут path

Каталоги и файлы, используемые для загрузки внешних файлов модулей, могут быть изменены с помощью атрибута path.

Для атрибутов path на модулях, не находящихся внутри встроенных блоков модулей, путь к файлу относится к каталогу, в котором находится исходный файл. Например, следующий фрагмент кода будет использовать пути, показанные в зависимости от его расположения:

#[path = "foo.rs"]
mod c;
Исходный файлРасположение файла cПуть модуля c
src/a/b.rssrc/a/foo.rscrate::a::b::c
src/a/mod.rssrc/a/foo.rscrate::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.rssrc/a/b/inline/other.rscrate::a::b::inline::inner
src/a/mod.rssrc/a/inline/other.rscrate::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. Модули также принимают атрибуты макросов.