如何在宏中允许可选的尾随逗号?

2024-05-20

这是我想要的综合示例:

macro_rules! define_enum {
    ($Name:ident { $($Variant:ident),* }) => {
        pub enum $Name {
            None,
            $($Variant),*,
        }
    }
}

define_enum!(Foo { A, B });

这段代码可以编译,但如果添加一个逗号:

define_enum!(Foo { A, B, });
//                     ^

编译失败。我可以用以下方法修复它:

($Name:ident { $($Variant:ident,)* })
//                             ^

但是之后define_enum!(Foo { A, B }); fails,

我应该如何编写宏来处理这两种情况:

define_enum!(Foo { A, B });
define_enum!(Foo { A, B, });

将逗号设为可选

作为DK.指出 https://stackoverflow.com/questions/43143327/how-to-allow-optional-trailing-commas-in-macros/43143459?noredirect=1#comment73365939_43143459,尾随逗号可以是可选的。

铁锈1.32

您可以使用?宏重复器来编写此内容并不允许多个尾随逗号:

($Name:ident { $($Variant:ident),* $(,)? }) => { 
//                                 ^^^^^

之前的版本

这允许多个尾随逗号:

($Name:ident { $($Variant:ident),* $(,)* }) => { 
//                                 ^^^^^

处理这两种情况

或者您可以通过...处理这两种情况来处理这两种情况:

macro_rules! define_enum {
    ($Name:ident { $($Variant:ident,)* }) => {
        pub enum $Name {
            None,
            $($Variant),*,
        }
    };
    ($Name:ident { $($Variant:ident),* }) => {
        define_enum!($Name { $($Variant,)* });
    };
}

define_enum!(Foo1 { A, B });
define_enum!(Foo2 { A, B, });

fn main() {}

我们已将主要实现移至需要尾随逗号的版本。然后,我们添加了第二个子句,该子句与缺少逗号的大小写相匹配,并将其重写为带有逗号的版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在宏中允许可选的尾随逗号? 的相关文章

随机推荐

  • 使用openssl解密用java加密的aes-gcm

    我有以下 Java 代码 public static void deriveKeyAndIV String password throws Exception SecureRandom random new SecureRandom if
  • 使用 C# 将事件导出为 iCalendar 和 vCalendar 格式

    我正在开发一个项目 我们将支持将事件导出到 Outlook 2007 Outlook 2010 和 iCal 的功能 我做了一些研究 发现 iCal 支持 iCal 程序 和 vCal 支持 Outlook 基本上是同一件事 据我所知 看起
  • LocationManager 与 FusedLocationProvider

    目前我们使用 LocationManager 每隔几秒获取一次 GPS 更新 我们用它来进行高精度更新 此外 我们还希望每 5 分钟获取一次位置坐标 无论 GPS 状态如何 打开 关闭 在这种情况下我们确实忽略了位置的准确性 我们希望使用
  • C++ 中的随机数生成...第一个数字不是很随机

    我试图在 C 中获得 0 到 1 之间的统一随机数 而不使用 boost 我不想依赖图书馆 每当我开始我的计划时 我都会种子 srand 时间 NULL 然后我打印 8 个随机数 我用空行分隔程序的不同运行 Random number 0
  • 在 Node.js 中,setTimeout() 会阻止事件循环吗?

    如果我有一个简单的 setTimeout 函数 并将其设置为 10 秒 整个服务器在那10秒内就死机了 这是真的 这就是我听到的 答案是no 你的链接是什么Node js 如何重新创建 setTimeout 函数而不阻塞事件循环 https
  • 暂存内部文件 csv.gz 给出文件与相应表的大小不匹配的错误?

    我正在尝试将 csv gz 文件复制到我创建的表中 以开始分析地图的位置数据 我遇到了一个错误 提示字符太多 我应该添加一个 on error 选项 不过 我不确定这是否有助于加载数据 你能看一下吗 数据源 https data world
  • 打印 2D ArrayList 矩阵的值

    我有一个 2D Arraylist 矩阵 例如 ArrayList table new ArrayList 10 10 table 0 0 new ArrayList table 0 1 add 10 table 1 0 add 20 ta
  • 启动过程中的写入进度 - 等待

    我正在尝试创建安装脚本并在安装过程中显示进度条 localfolder Get Location path start process FilePath localfolder Installer exe ArgumentList sile
  • 如何计算排列? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个关于 Java 排列的问题 Suppose I have five different elements in an arra
  • 使用 ClosedXML 创建数据透视表

    我正在尝试使用 ClosedXML V0 91 1 创建数据透视表 但我不断遇到问题 因为我的 Excel 文件包含不可读的内容 然后 Excel 工作簿在单击时删除了我的数据透视表Yes below 下面是我击中时的显示Yes 它正在删除
  • 如何在验收测试期间从 Struts 2 获取 ActionContext?

    我正在使用 cucumber jvm 在一个使用 Struts 2 和 Tomcat 作为我的 Servlet 容器的应用程序上编写验收测试 测试行为 在我的代码中的某个时刻 我需要从 Struts 2 中获取用户HttpSession 由
  • 了解新的 mongo id 并将其与 Iron-router 一起使用

    我有一个简单的帖子路线来寻找帖子 id 问题是pathFor助手创建这样的路径 ObjectID 52e16453431fc2fba4b6d6a8 我猜 mongoDB 插入已更改 现在 id对象在其内部包含另一个对象 称为 str 这是我
  • 我可以在 IIS 中禁用大量更改通知吗

    我偶尔会收到以下导致应用程序池被回收的事件 shutDownMessage CONFIG change HostingEnvironment initiated shutdown Overwhelming Change Notificati
  • Qt 安装程序框架 - 如何在卸载时仅删除某些文件和文件夹

    我使用 Qt 安装程序框架 如何确保在卸载时仅删除某些文件或文件夹 而不是像当前那样删除安装文件夹中的所有文件 先感谢您 您可以覆盖默认行为component createOperations对于卸载程序 然后使用手动指定每个卸载路径com
  • 如何快速更改按钮图像?

    我正在开发一个有按钮的应用程序 该按钮没有文本 图像或背景 所以我想做的就是在viewDidLoad函数中给它一个图像 这就是我所拥有的 IBOutlet var tapButton UIButton override func viewD
  • 使用超类初始化器初始化类

    我有两个类 一个是另一个的子类 比如说Animal and Dog 超类有一些初始化器 比如initAnimal 子类有一些初始化器 比如initDog 问题是 从编译器的角度来看 做类似的事情是完全合法的Dog adog Dog allo
  • 无法通过 python3 启动 Selenium Safari WebDriver

    我想使用 Safari 作为 python 的浏览器 代码相当简单 from selenium import webdriver driver webdriver Safari url https www gmail com driver
  • 应用旋转时,HTML5 canvas Clip() 在 Chrome 中不起作用

    我试图在画布上使用剪辑区域 一旦坐标系旋转任何非零值 它就会停止工作 window onload function var canvas document getElementById mainCanvas var ctx canvas g
  • Javascript 在没有 id 的情况下取消标记跨度

    是否可以找到并取消标记字符串中没有 id 的跨度 我有一个文本 其中有一堆跨度 其中一些有 id 另一些则没有 Input span Hi there span span This is a test span Output Hi ther
  • 如何在宏中允许可选的尾随逗号?

    这是我想要的综合示例 macro rules define enum Name ident Variant ident gt pub enum Name None Variant define enum Foo A B 这段代码可以编译 但