附录 A: 关键字
以下列表包含 Rust 语言为当前或未来使用而保留的关键词。因此,它们不能用作标识符(除非作为原始标识符,我们将在 “原始标识符” 部分讨论)。标识符是函数、变量、参数、结构体字段、模块、crate、常量、宏、静态值、属性、类型、特征或生命周期的名称。
当前使用的关键词
以下是在使用的关键词列表,以及它们的功能描述。
as: 执行原始类型转换,消除包含项的具体特征的歧义,或在use语句中重命名项。async: 返回一个Future而不是阻塞当前线程。await: 暂停执行,直到Future的结果准备就绪。break: 立即退出循环。const: 定义常量项或常量原始指针。continue: 继续下一次循环迭代。crate: 在模块路径中,指代 crate 根。dyn: 动态分发到特征对象。else:if和if let控制流结构的回退。enum: 定义一个枚举。extern: 链接外部函数或变量。false: 布尔假字面值。fn: 定义一个函数或函数指针类型。for: 遍历来自迭代器的项,实现一个特质,或指定一个高阶生命周期。if: 根据条件表达式的结果进行分支。impl: 实现固有或特征功能。in:for循环语法的一部分。let: 绑定一个变量。loop: 无条件循环。match: 将值与模式匹配。mod: 定义一个模块。move: 使闭包拥有其所有捕获的变量。mut: 在引用、原始指针或模式绑定中表示可变性。pub: 在结构体字段、impl块或模块中表示公共可见性。ref: 按引用绑定。return: 从函数返回。Self: 一个类型别名,用于我们正在定义或实现的类型。self: 方法主体或当前模块。static: 全局变量或持续整个程序执行的生命周期。struct: 定义一个结构。super: 当前模块的父模块。trait: 定义一个特质。true: 布尔真值。type: 定义类型别名或关联类型。union: 定义一个 联合体; 仅在用于联合体声明时是关键字。unsafe: 标记不安全的代码、函数、特质或实现。use: 将符号引入作用域。where: 表示限制类型的子句。while: 根据表达式的结果有条件地循环。
为将来保留的关键词
以下关键字目前尚无任何功能,但已被 Rust 预留以供将来可能使用:
抽象成为box执行最终生成器宏覆盖私尝试typeof未定大小虚拟yield
原始标识符
原始标识符 是允许你在通常不允许使用关键字的地方使用关键字的语法。你通过在关键字前加上 r# 来使用原始标识符。
例如,match 是一个关键字。如果你尝试编译以下使用 match 作为其名称的函数:
文件名: src/main.rs
fn match(needle: &str, haystack: &str) -> bool {
haystack.contains(needle)
}
你会遇到这个错误:
error: expected identifier, found keyword `match`
--> src/main.rs:4:4
|
4 | fn match(needle: &str, haystack: &str) -> bool {
| ^^^^^ expected identifier, found keyword
错误显示你不能将关键字match用作函数标识符。要将match用作函数名,你需要使用原始标识符语法,如下所示:
文件名: src/main.rs
fn r#match(needle: &str, haystack: &str) -> bool { haystack.contains(needle) } fn main() { assert!(r#match("foo", "foobar")); }
这段代码将不会出现任何编译错误。注意函数定义及其在 main 中被调用时的函数名前的 r# 前缀。
原始标识符允许你使用任何你选择的单词作为标识符,即使该单词碰巧是保留关键字。这给了我们更多的自由来选择标识符名称,同时也让我们能够与这些单词不是关键字的其他语言编写的程序集成。此外,原始标识符允许你使用与你的 crate 使用的不同 Rust 版本编写的库。例如,try 在 2015 版本中不是关键字,但在 2018、2021 和 2024 版本中是关键字。如果你依赖于一个使用 2015 版本编写的库,并且该库有一个 try 函数,你需要使用原始标识符语法,即 r#try,在较新版本中调用该函数。有关版本的更多信息,请参见 附录 E。