gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:41:36 26 4
gpt4 key购买 nike

这是我想要的合成示例:

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 }); 失败了,

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

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

最佳答案

处理这两种情况

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

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() {}

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

使逗号可选

DK. points out an alternative , 使尾随逗号本身成为可选的。

这避免了将一个实现委托(delegate)给另一个实现的需要。

使用rust 1.32

您可以使用 ? 宏重复器来编写此代码并禁止使用多个尾随逗号:

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

以前的版本

这允许多个尾随逗号:

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

关于macros - 如何在宏中允许可选的尾随逗号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43143327/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com