Modules Structure
External link: https://doc.rust-lang.org/stable/book/ch07-02-defining-modules-to-control-scope-and-privacy.html
Правила работы с модулями
- Crate Root. При компиляции crate, компилятор ищет корень: src/lib.rs для библиотеки, либо src/main.rs для запускаемого файла (binary);
- Модули. При декларировании модуля в crate root, например,
mod test, компилятор будет искать его код в одном из мест:- Сразу после объявления в том же файле (inline);
- В файле src/test.rs;
- В файл src/test/mod.rs - старый стиль, поддерживается, но не рекомендуется.
- Подмодули. В любом файле, кроме crate root, можно объявить подмодуль, например,
mod automa. Компилятор будет искать код подмодуля в одном из мест:- Сразу после объявления в том же файле (inline);
- В файле src/test/automa.rs;
- В файле src/test/automa/mod.rs - *старый стиль, поддерживается, но не рекомендуется.
- Путь до кода. Когда модуль часть crate, можно обращаться к его коду из любого места этой crate в соответствии с правилами privacy и указывая путь до кода. Например, путь до типа robot в подмодуле automa будет
crate::test::automa::robot; - Private/public. Код модуля скрыт от родительских модулей по умолчанию. Для его публикации нужно объявлять его с
pub modвместоmod; - Use. Ключевое слово
useнужно для сокращения написания пути до кода:use crate::test::automa::robotпозволяет далее писать простоrobotдля обращения к данным этого типа.
Note
Нужно лишь единожды внести внешний файл с помощью mod в дереве модулей, чтобы он стал частью проекта, и чтобы другие файлы могли на него ссылаться. В каждом файле с помощью mod не надо ссылаться, mod - это НЕ include из Python и других языков программирования.
Пример структуры
Вложенные модули
Для примера, возьмём библиотеку, обеспечивающую работу ресторана. Ресторан делится на части front - обслуживание посетителей, и back - кухня, мойка, бухгалтерия.
Пример обращения к функции вложенного модуля
Объявление модуля публичным с помощью pub не делает его функции публичными. Нужно указывать публичность каждой функции по отдельности:
Обращние к функции выше уровнем
Относительный вызов функции можно сделать через super (аналог “..” в файловой системе):
Обращение к структурам и перечислениям
Поля структур приватны по умолчанию. Обозначение структуры публичной с pub не делает её поля публичными - каждое поле нужно делать публичным по отдельности.
Поля перечислений публичны по умолчанию. Достатоно сделать само перечисление публичным pub enum, чтобы видеть все его поля.
Обращение к объектам под другим именем
С помощью as можно создать ярлык на объект в строке с use. Особенно это удобно в случае, когда нужно обратиться к одинаковым по имени объектам в разных модулях:
Ре-экспорт объектов
При обращении к объекту с помощью use, сам ярлык этот становится приватным - через него могут обращаться только функции текущего scope. Для того, чтобы из других модулей функции могли тоже обратиться через этот ярлык, нужно сделать его публичным:
Работа с внешними библиотеками
Внешние библиотеки включаются в файл Cargo.toml. Далее, публичные объекты из них заносятся в scope с помощью use.
Если нужно внести несколько объектов из одной библиотеки, то можно сократить количество use:
Warning
Следует быть осторожным с оператором glob - *, так как про внесённые с его помощью объекты сложно сказать, где именно они были определены.