ПрограммированиеRust-бэкенд разработчик

Объясните, как работает система модулей (modules) и видимость (pub, pub(crate), private) в Rust. Как можно организовать крупный проект и избежать конфликтов имён?

Проходите собеседования с ИИ помощником Hintsage

Ответ

Система модулей в Rust строится вокруг ключевого слова mod. Модули позволяют логически разбивать код по файлам и пространствам имён. Ключевые моменты:

  • Всё по умолчанию — приватно (private) в рамках текущего модуля.
  • pub делает элемент публичным для всего дерева модулей.
  • pub(crate) — доступен во всём crate (т.е. библиотеке/projekt’е).
  • Конфликты имён решаются пространствами имён: явным импортом (use mod_name::item) и alias’ами.

Для крупных проектов рекомендуют использовать дерево модулей с описанием публичных интерфейсов только через lib.rs или main.rs, остальное приватно:

mod network; mod storage; pub use network::api;

Вопрос с подвохом

Если структура объявлена как pub, станет ли она доступной для других crate?

Ответ: Нет, недостаточно просто пометить struct как pub. Необходимо также, чтобы она была объявлена в модуле, открытом внешним crate (pub mod), а поля структуры должны быть public, чтобы к ним был прямой доступ.

Пример:

mod foo { pub struct Bar; } // Bar не виден вне crate, так как foo — private

Примеры реальных ошибок из-за незнания тонкостей темы


История

В проекте со сложной структурой модулей случайно объявили структуру pub, но не экспортировали модуль как pub. Позже пытались использовать структуру из другого crate — получили ошибку о недоступности типа.

История

В большой библиотеке разные модули экспортировали одинаковые имена (например, types и errors). При слепом использовании use * возникли конфликты имён на этапе компиляции. Решением стало добавление псевдонимов и импорт только нужных элементов.

История

Многие новички создают структуру pub, но оставляют поля private, что делает невозможным их инициализацию вне модуля. В результате функция из другого модуля не могла создать структуру напрямую, что вызывало ошибки, пока не сделали поля или конструкторы публичными.