Пространства имён
Пространство имён — это логическая группировка объявленных имён. Имена разделены на отдельные пространства имён в зависимости от вида сущности, на которую ссылается имя. Пространства имён позволяют появлению имени в одном пространстве имён не конфликтовать с тем же именем в другом пространстве имён.
Существует несколько различных пространств имён, каждое из которых содержит различные виды сущностей. Использование имени будет искать объявление этого имени в разных пространствах имён, в зависимости от контекста, как описано в главе о разрешении имён.
Следующий список представляет пространства имён с соответствующими им сущностями:
- Пространство имён типов
- Объявления модулей
- Объявления внешних крейтов
- Элементы прелюдии внешних крейтов
- Объявления структур, объединений, перечислений, вариантов перечислений
- Объявления элементов трейтов
- Псевдонимы типов
- Объявления ассоциированных типов
- Встроенные типы: логический, числовые и текстовые
- Обобщённые параметры типа
- Тип
Self - Модули инструментальных атрибутов
- Пространство имён значений
- Объявления функций
- Объявления констант
- Объявления статических элементов
- Конструкторы структур
- Конструкторы вариантов перечислений
- Конструкторы
Self - Обобщённые параметры констант
- Объявления ассоциированных констант
- Объявления ассоциированных функций
- Локальные привязки —
let,if let,while let,for, рукиmatch, параметры функций, параметры замыканий - Захваченные переменные замыканий
- Пространство имён макросов
- Пространство имён времён жизни
- Пространство имён меток
Пример того, как перекрывающиеся имена в разных пространствах имён могут быть использованы однозначно:
#![allow(unused)] fn main() { // Foo вводит тип в пространстве имён типов и конструктор в пространстве // имён значений. struct Foo(u32); // Макрос `Foo` объявлен в пространстве имён макросов. macro_rules! Foo { () => {}; } // `Foo` в типе параметра `f` ссылается на `Foo` в пространстве имён типов. // `'Foo` вводит новое время жизни в пространстве имён времён жизни. fn example<'Foo>(f: Foo) { // `Foo` ссылается на конструктор `Foo` в пространстве имён значений. let ctor = Foo; // `Foo` ссылается на макрос `Foo` в пространстве имён макросов. Foo!{} // `'Foo` вводит метку в пространстве имён меток. 'Foo: loop { // `'Foo` ссылается на параметр времени жизни `'Foo`, а `Foo` // ссылается на пространство имён типов. let x: &'Foo Foo; // `'Foo` ссылается на метку. break 'Foo; } } }
Именованные сущности без пространства имён
Следующие сущности имеют явные имена, но имена не являются частью какого-либо конкретного пространства имён.
Поля
Несмотря на то, что поля структур, перечислений и объединений именованы, именованные поля не находятся в явном пространстве имён. К ним можно получить доступ только через выражение поля, которое проверяет только имена полей конкретного типа, к которому осуществляется доступ.
Use-объявления
Use-объявление имеет именованные псевдонимы, которые оно импортирует в область видимости, но
сам элемент use не принадлежит к определённому пространству имён. Вместо этого он может
вводить псевдонимы в несколько пространств имён, в зависимости от вида импортируемого
элемента.
Подпространства имён
Пространство имён макросов разделено на два подпространства имён: одно для макросов с восклицательным знаком и одно для атрибутов. Когда атрибут разрешается, любые макросы с восклицательным знаком в области видимости игнорируются. И наоборот, разрешение макроса с восклицательным знаком игнорирует атрибутные макросы в области видимости. Это предотвращает затенение одного стиля другим.
Например, атрибут cfg и макрос cfg — это две разные сущности с одним и тем же именем в пространстве имён макросов, но они всё равно могут использоваться в своих соответствующих контекстах.
Всё ещё ошибкой является затенение одним импортом use другого макроса, независимо от их подпространств имён.