Del*_*ore 5 macros parsing rust
我有一个宏,可以简化从字符串中解析枚举的过程:
enum_printer!(Bar { fun1["AB","CD"]; fun2[] });
Run Code Online (Sandbox Code Playgroud)
为了使其更容易使用,我想让[]可选的 ie 能够指定
enum_printer!(Bar { fun1["AB","CD"]; fun2; fun3 });
Run Code Online (Sandbox Code Playgroud)
这是现在的代码
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"))
}
}
}
};
}
Run Code Online (Sandbox Code Playgroud)
我尝试修改第一行:
($name:ident { $($enumeration:ident [$($v:expr),*]?);* }) => {
Run Code Online (Sandbox Code Playgroud)
enum_printer!(Bar { fun1["AB","CD"]; fun2[] });
Run Code Online (Sandbox Code Playgroud)
有办法实现这一点吗?
the 的语法与or?的语法相同:您必须像这样包围可选模式。*+$( <pattern> )?
例子:
#![feature(macro_at_most_once_rep)]
macro_rules! foo {
( $( $e:expr )? ) => {
$( $e )?
}
}
Run Code Online (Sandbox Code Playgroud)
在您的示例中,您必须编写:
($name:ident {
$(
$enumeration:ident $(
[$( $v:expr ),*]
)? // optional parameter
);* // possible multiple parameters
}) => {
Run Code Online (Sandbox Code Playgroud)
(为了更清楚我把这条线分开了)
| 归档时间: |
|
| 查看次数: |
1139 次 |
| 最近记录: |