附录 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- 定义 Traittrue- 布尔值 true 字面量type- 定义类型别名或关联类型union- 定义 union; 仅在 union 声明中使用时才是关键字unsafe- 表示不安全的代码、函数、Trait 或实现use- 将符号引入作用域where- 表示约束类型的子句while- 基于表达式的结果有条件地循环
为将来使用保留的关键字
以下关键字尚未具有任何功能,但 Rust 保留了它们以备将来可能的用途。
abstractbecomeboxdofinalmacrooverrideprivtrytypeofunsizedvirtualyield
原始标识符
原始标识符 是一种语法,允许您在通常不允许使用关键字的地方使用关键字。 您可以通过在关键字前加上 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")); }
此代码将编译且没有任何错误。 请注意函数名称定义中的 r# 前缀以及在 main 中调用函数的位置。
原始标识符允许您使用您选择的任何单词作为标识符,即使该单词恰好是保留关键字。 这使我们能够更自由地选择标识符名称,并使我们能够与以这些单词不是关键字的语言编写的程序集成。 此外,原始标识符允许您使用以与您的 Crate 使用的 Rust 版本不同的版本编写的库。 例如,try 在 2015 版本中不是关键字,但在 2018 版本中是。 如果您依赖于使用 2015 版本编写并具有 try 函数的库,您需要使用原始标识符语法 r#try(在本例中)从您的 2018 版本代码中调用该函数。 请参阅 附录 E以获取有关版本的更多信息。