Macro_rules 是常规宏吗?

ard*_*bro 6 rust rust-macros

我试图理解 Rust 宏语法。在这里我读到宏通常可以通过 3 种方式调用:

mymacro!(<tokens>);
mymacro![<tokens>];
mymacro!{<tokens>};
Run Code Online (Sandbox Code Playgroud)

...然后我看到一个示例宏定义也使用宏 ( macro_rules),但语法不符合以下规则:

macro_rules! name {<tokens>}
Run Code Online (Sandbox Code Playgroud)

name一个标记,我们在这里有第四个合法的宏调用形式,或者macro_rules是一个关键字而不仅仅是宏,并且使用常规宏不可用的特殊语法?

Net*_*ave 9

不,macro_rules是一个特殊的“指令”。您可以在此处检查编译器语法树。重要的部分是:

Syntax
MacroRulesDefinition :
   macro_rules ! IDENTIFIER MacroRulesDef
Run Code Online (Sandbox Code Playgroud)

您可以看到它是宏语法的入口点。