gpt4 book ai didi

parsing - 有没有办法在宏中实现可选表达式?

转载 作者:行者123 更新时间:2023-11-29 08:00:19 25 4
gpt4 key购买 nike

我有一个宏可以简化从以下形式的字符串中解析枚举:

enum_printer!(Bar { fun1["AB","CD"]; fun2[] });

为了让它更容易使用,我想将 [] 设为可选,即能够指定

enum_printer!(Bar { fun1["AB","CD"]; fun2; fun3 });

下面是代码

use failure::Error;
use std::convert::TryFrom;

macro_rules! enum_printer {
($name:ident { $($enumeration:ident [$($v:expr),*]);* }) => {
#[derive(Debug)]
enum $name {
$(
$enumeration,
)*
}
impl<'a> TryFrom<&'a str> for $name {
type Error = Error;
fn try_from(value : &'a str) -> Result<$name,Error> {
match value {
$(
stringify!($enumeration)
$(
| $v
)*
=> Ok($name::$enumeration),
)*
_ => Err(err_msg("Could not convert from string to"))
}
}
}
};
}

我试图修改第一行:

($name:ident { $($enumeration:ident [$($v:expr),*]?);* }) => {
error: no rules expected the token `;`
--> src/main.rs:30:36
|
30 | enum_printer!(Bar { fun1["AB","CD"]; fun2; fun3 });
| ^

有什么办法可以实现吗?

最佳答案

? 的语法与 * 相同或 + : 你必须像这样包围可选模式 $( <pattern> )? .

例子:

#![feature(macro_at_most_once_rep)]

macro_rules! foo {
( $( $e:expr )? ) => {
$( $e )?
}
}

在你的例子中,你必须写:

($name:ident {
$(
$enumeration:ident $(
[$( $v:expr ),*]
)? // optional parameter
);* // possible multiple parameters
}) => {

(为了更清楚,我把线分开了)

关于parsing - 有没有办法在宏中实现可选表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50718877/

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