Идентификаторы
Lexer
IDENTIFIER_OR_KEYWORD → ( XID_Start | _ ) XID_Continue*
XID_Start → <XID_Start определено в Unicode>
XID_Continue → <XID_Continue определено в Unicode>
RAW_IDENTIFIER → r# IDENTIFIER_OR_KEYWORD
NON_KEYWORD_IDENTIFIER → IDENTIFIER_OR_KEYWORDкроме строгих или зарезервированных ключевых слов
IDENTIFIER → NON_KEYWORD_IDENTIFIER | RAW_IDENTIFIER
RESERVED_RAW_IDENTIFIER → r# ( _ | crate | self | Self | super )
Идентификаторы соответствуют спецификации UAX31 для версии Unicode 16.0, с добавлениями, описанными ниже. Некоторые примеры идентификаторов:
foo_identifierr#trueМосква東京
Используемый профиль из UAX #31:
- Start :=
XID_Start, плюс символ подчёркивания (U+005F) - Continue :=
XID_Continue - Medial := пусто
Note
Идентификаторы, начинающиеся с подчёркивания, обычно используются для обозначения намеренно неиспользуемого идентификатора и отключают предупреждение о неиспользовании в
rustc.
Идентификаторы не могут быть строгими или зарезервированными ключевыми словами без префикса r#, описанного ниже в разделе Сырые идентификаторы.
Символы неразрывного нулевой ширины (ZWNJ U+200C) и соединения нулевой ширины (ZWJ U+200D) не допускаются в идентификаторах.
Идентификаторы ограничены ASCII-подмножеством XID_Start и XID_Continue в следующих ситуациях:
- Объявления
extern crate(за исключением идентификатора в AsClause) - Имена внешних крейтов, на которые ссылается path
- Имена module, загружаемые из файловой системы без атрибута
path - Элементы с атрибутом
no_mangle - Имена элементов во внешних блоках
Нормализация
Идентификаторы нормализуются с использованием Формы нормализации C (NFC), как определено в UAX15. Два идентификатора считаются равными, если равны их формы NFC.
Процедурные (proc-macro) и декларативные (mbe) макросы получают нормализованные идентификаторы на входе.
Raw идентификаторы
Сырой идентификатор похож на обычный идентификатор, но с префиксом r#. (Обратите внимание, что префикс r# не является частью самого идентификатора).
В отличие от обычного идентификатора, сырым идентификатором может быть любое строгое или зарезервированное ключевое слово, кроме перечисленных выше для RESERVED_RAW_IDENTIFIER.
Использование токена RESERVED_RAW_IDENTIFIER является ошибкой.