01-命名空间

命名空间 — The Rust Reference

译文 · 基于 The Rust Reference

原文链接: https://doc.rust-lang.org/reference/names/namespaces.html

r[names.namespaces]

命名空间

r[names.namespaces.intro] 命名空间是已声明名称的逻辑分组。名称根据其所指实体的种类被分隔到不同的命名空间中。命名空间允许一个命名空间中出现的名称与另一命名空间中的同名不冲突。

存在若干不同的命名空间,各自包含不同种类的实体。对名称的使用会根据上下文在不同命名空间中查找该名称的声明,如名称解析一章所述。

r[names.namespaces.kinds] 以下是命名空间及其对应实体的列表:

不同命名空间中重叠名称可无歧义使用的示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Foo 在类型命名空间中引入一个类型,在值命名空间中引入一个构造函数。
struct Foo(u32);

// `Foo` 宏声明在宏命名空间中。
macro_rules! Foo {
    () => {};
}

// `f` 参数类型中的 `Foo` 指类型命名空间中的 `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;
    }
}

r[names.namespaces.without]

没有命名空间的具名实体

下列实体具有显式名称,但这些名称不属于任何特定命名空间。

字段

r[names.namespaces.without.fields] 尽管结构体、枚举与联合体的字段是具名的,具名字段并不位于显式命名空间中。它们只能通过字段表达式访问,该表达式仅检查被访问的特定类型的字段名。

use 声明

r[names.namespaces.without.use] use 声明具有导入到作用域中的具名别名,但 use 项本身并不属于特定命名空间。相反,它可以根据所导入项的种类,将别名引入多个命名空间。

r[names.namespaces.sub-namespaces]

子命名空间

r[names.namespaces.sub-namespaces.intro] 宏命名空间分为两个子命名空间:一个用于bang 风格宏,一个用于属性。解析属性时,作用域中的任何 bang 风格宏都会被忽略。反之,解析 bang 风格宏时会忽略作用域中的属性宏。这可防止一种风格遮蔽另一种风格。

例如,cfg 属性与 cfg 宏是宏命名空间中同名的两个不同实体,但它们仍可在各自的上下文中使用。

注意 无论子命名空间如何,use 导入仍不能在模块或块中为同一名称创建重复绑定。

1
2
3
4
5
6
#[macro_export]
macro_rules! mymac {
    () => {};
}

use myattr::mymac; // error[E0252]: the name `mymac` is defined multiple times.
最后修改 August 21, 2026: 更新 (76fc81a2e)