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

Пространства имён

Пространство имён — это логическая группировка объявленных имён. Имена разделены на отдельные пространства имён в зависимости от вида сущности, на которую ссылается имя. Пространства имён позволяют появлению имени в одном пространстве имён не конфликтовать с тем же именем в другом пространстве имён.

Существует несколько различных пространств имён, каждое из которых содержит различные виды сущностей. Использование имени будет искать объявление этого имени в разных пространствах имён, в зависимости от контекста, как описано в главе о разрешении имён.

Следующий список представляет пространства имён с соответствующими им сущностями:

Пример того, как перекрывающиеся имена в разных пространствах имён могут быть использованы однозначно:

#![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 другого макроса, независимо от их подпространств имён.