首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >生锈宏:带括号的宏体和带括号的宏体有什么区别?

生锈宏:带括号的宏体和带括号的宏体有什么区别?
EN

Stack Overflow用户
提问于 2020-05-23 08:45:03
回答 2查看 903关注 0票数 0

阿法克,Rust中的宏由以下语法声明:

代码语言:javascript
运行
复制
macro_rules! <name> {
    (<pattern>) => {
        <implementation>
    };
}

但是,我发现了一个版本,在这个版本中,主体是用括号括起来的,而不是生锈中的大括号。

代码语言:javascript
运行
复制
macro_rules! <name> {
    (<pattern>) => (
        <implementation>
    )
}

还请注意丢失的尾随分号。我最好的猜测是,这与这个宏使用的尾递归有关,但是,在括号中的宏体和用大括号括起来的宏体之间的官方区别是什么呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-23 09:10:06

macro_rules中的分支只需用;分隔。尾随分号在那里是可选的。在形式语法 of macro_rules中,这是由

代码语言:javascript
运行
复制
MacroRules :
   MacroRule ( ; MacroRule )* ;?

这里的语法类似于regex。规则列表至少是一个规则,后面是任意数量的分号-MacroRule对。所有这些后面都是一个可选的分号。

在这里,选择(){}还是[]实际上并不重要。这三种方法都是解析DelimTokenTree的公认方法。

代码语言:javascript
运行
复制
DelimTokenTree :
     ( TokenTree* )
   | [ TokenTree* ]
   | { TokenTree* }

这意味着无论DelimTokenTree是由()[]还是{}包围的,它都将被解析为相同的内容。

特别是,您所链接的宏与选择括号和尾随分号的所有六个组合一样工作。

票数 2
EN

Stack Overflow用户

发布于 2020-05-23 09:02:05

(..)[..]{..}之间的宏定义没有区别,参见参考文献=>右侧的块的语法是DelimTokenTree。我想,拥有这三个变体的动机是允许宏的模式包含任意两种类型的大括号。

分号是可选的,在MacroRules语法中可以看到。您甚至可以对宏的外部部分使用(..)[..]

当您使用调用宏时,您也可以使用这三种口味,但是如何使用这三种口味都有限制:

当用作项或语句时,如果不使用大括号,则在末尾需要分号的情况下使用MacroInvocationSemi窗体。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61969531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档