01-命名空间
3 分钟阅读
译文 · 基于 The Rust Reference
原文链接: https://doc.rust-lang.org/reference/names/namespaces.html
r[names.namespaces]
命名空间
r[names.namespaces.intro] 命名空间是已声明名称的逻辑分组。名称根据其所指实体的种类被分隔到不同的命名空间中。命名空间允许一个命名空间中出现的名称与另一命名空间中的同名不冲突。
存在若干不同的命名空间,各自包含不同种类的实体。对名称的使用会根据上下文在不同命名空间中查找该名称的声明,如名称解析一章所述。
r[names.namespaces.kinds] 以下是命名空间及其对应实体的列表:
- 类型命名空间
- 值命名空间
- 宏命名空间
- 生命周期命名空间
- 标签命名空间
不同命名空间中重叠名称可无歧义使用的示例:
| |
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.