附录 A:关键字
以下列表列出了 Rust 语言当前或未来保留使用的关键字。因此,除了本节“原始标识符”中介绍的原始标识符形式外,这些关键字都不能用作标识符。标识符是函数、变量、参数、结构体字段、模块、crate、常量、宏、静态值、属性、类型、trait 或生命周期的名称。
当前使用的关键字
以下列出了当前使用的关键字及其功能。
as:执行基本类型转换、消除所含条目的具体 trait 的歧义,或在use语句中重命名条目。async:返回一个Future,而不是阻塞当前线程。await:暂停执行,直到Future的结果就绪。break:立即退出循环。const:定义常量项或常量原始指针。continue:继续执行下一次循环迭代。crate:在模块路径中,指代 crate 根。dyn:对 trait 对象进行动态分发。else:为if和if let控制流结构提供备用分支。enum:定义枚举。extern:链接外部函数或变量。false:布尔值 false 字面量。fn:定义函数或函数指针类型。for:遍历迭代器中的项、实现 trait,或指定高阶生命周期。if:根据条件表达式的结果进行分支。impl:实现固有功能或 trait 功能。in:for循环语法的一部分。let:绑定变量。loop:无条件循环。match:将值与模式进行匹配。mod:定义模块。move:使闭包取得其所有捕获值的所有权。mut:表示引用、原始指针或模式绑定具有可变性。pub:表示结构体字段、impl块或模块具有公共可见性。ref:通过引用进行绑定。return:从函数返回。Self:当前正在定义或实现的类型的类型别名。self:方法的接收者或当前模块。static:全局变量,或生命周期覆盖整个程序执行过程的值。struct:定义结构体。super:当前模块的父模块。trait:定义 trait。true:布尔值 true 字面量。type:定义类型别名或关联类型。union:定义 联合体;只有在联合体声明中使用时才是关键字。unsafe:表示不安全代码、函数、trait 或实现。use:将符号引入作用域。where:表示用于约束类型的子句。while:根据表达式的结果进行条件循环。
保留供将来使用的关键字
以下关键字目前尚无任何功能,但 Rust 保留它们以供将来使用:
abstractbecomeboxdofinalgenmacrooverrideprivtrytypeofunsizedvirtualyield
原始标识符
原始标识符是一种语法,允许你在通常不允许使用关键字的地方使用关键字。只需在关键字前加上 r#,即可使用原始标识符。
例如,match 是一个关键字。如果尝试编译下面这个以 match 命名的函数:
Filename: 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 用作函数名,需要使用原始标识符语法,如下所示:
Filename: src/main.rs
fn r#match(needle: &str, haystack: &str) -> bool {
haystack.contains(needle)
}
fn main() {
assert!(r#match("foo", "foobar"));
}
这段代码可以通过编译,不会产生任何错误。注意,函数定义中的名称以及在 main 中调用函数时,都带有 r# 前缀。
原始标识符允许你将任意单词用作标识符,即使该单词恰好是保留关键字。这让我们在选择标识符名称时更自由,也便于与使用这些单词但不将其视为关键字的语言编写的程序集成。此外,原始标识符还允许你使用由不同 Rust 版本编写的库。例如,try 在 2015 版本中不是关键字,但在 2018、2021 和 2024 版本中是关键字。如果依赖一个使用 2015 版本编写且包含 try 函数的库,那么在较新版本的代码中调用该函数时,需要使用原始标识符语法,即 r#try。有关版本的更多信息,请参阅附录 E。