Afaik,Rust中的宏通过以下语法声明:
macro_rules! <name> {
(<pattern>) => {
<implementation>
};
}
但是我发现了一个版本,其中主体用括号括起来,而不是Rust by Example中的花括号:
macro_rules! <name> {
(<pattern>) => (
<implementation>
)
}
还请注意缺少的尾随分号。我最好的猜测是,这与该宏使用的尾部递归有关,但是括号内的宏主体与括号内的宏主体之间的正式区别是什么?
最佳答案
macro_rules
中的分支只需用;
分隔即可。尾随分号是可选的。在macro_rules
的formal grammar中,此描述为
MacroRules :
MacroRule ( ; MacroRule )* ;?
此处的语法类似于正则表达式。规则列表至少是一个规则,其后是任意数量的分号-jitt_code对。所有这一切之后是可选的分号。
实际上,这里的
MacroRule
,()
或{}
的选择完全无关紧要。这三种都是解析 []
的公认方法DelimTokenTree :
( TokenTree* )
| [ TokenTree* ]
| { TokenTree* }
这意味着无论
DelimTokenTree
被DelimTokenTree
,()
还是[]
包围,它的解析方式都是相同的。特别是,您链接的宏与带有括号和尾部分号的all six combinations相同。
关于rust - Rust宏: What is the difference between braced and parenthesized macro bodies?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61969531/