Identifiers

标识符

identifiers.md
commit: 1f9de62e04e6c79922ab78062407a658f4c3fa6a
本章译文最后维护日期:2022-10-22

词法分析:
IDENTIFIER_OR_KEYWORD :
      XID_Start XID_Continue*
   | _ XID_Continue+

RAW_IDENTIFIER : r# IDENTIFIER_OR_KEYWORD 排除 crate, self, super, Self

NON_KEYWORD_IDENTIFIER : IDENTIFIER_OR_KEYWORD *排除严格关键字保留关键字 *

IDENTIFIER :
NON_KEYWORD_IDENTIFIER | RAW_IDENTIFIER

标识符遵循 Unicode标准附录31 中针对 Unicode 15.0版的规范,后面所述内容在此版本中均有备述。 这里举一些标识符的示例:

  • foo
  • _identifier
  • r#true
  • Москва
  • 東京

其中 UAX #31 中要求标识符使用的(产生式)参数如下:

  • 起始字符 := XID_Start,外加一个下划线 (U+005F)
  • 后续字符 := XID_Continue
  • 中间字符 := 空

还有一个附加约束,即单个下划线字符不是标识符。

注意: 以下划线开头的标识符通常用于表示有意不会被实际使用的标识符,且会使 rustc 对未被使用的警告静音。

如果标识符没有下面原生标识符章节中描述的 r#前缀,那它不能是严格关键字保留关键字

标识符中不允许使用零宽度非连接符(ZWNJ U+200C)和零宽度连接符(ZWJ U+200D)。

在下列情况下,标识符仅限于 XID_StartXID_Continue 的ASCII子集:

Normalization

标准化

标识符使用Unicode标准附录15中定义的规范化形式C(NFC)进行规范化。如果两个标识符的 NFC形式相等,那么它们就是等价的。

[过程宏][proc macro]和声明宏在其输入中接受规范化的标识符。

Raw identifiers

原生标识符

除了有形式前缀 r# 修饰外,原生标识符与普通标识符类似。(注意形式前缀 r# 不包括在实际标识符中。)与普通标识符不同,原生标识符可以是除上面列出的 RAW_IDENTIFIER 之外的任何严格关键字或保留关键字。