Error handling 宏匹配臂模式“;没有规则需要标记'if`";

Error handling 宏匹配臂模式“;没有规则需要标记'if`";,error-handling,rust,macros,pattern-matching,Error Handling,Rust,Macros,Pattern Matching,所以我有一个宏,它用来匹配多个错误类型的Box #[宏导出] 宏规则!dynmatch{ ($e:expr,$(键入$ty:ty{$(arm$pat:pat=>$result:expr),*,=>$any:expr}),*,=>$end:expr)=>( $( 如果让一些(e)=$e.downcast_ref:(){ 匹配e{ $( $pat=>{$result} )* _=>$any } }否则 )* {$end} ); } 在我尝试添加火柴之前,它一直运行良好。当我尝试在模式中使用“if”

所以我有一个宏,它用来匹配多个错误类型的
Box

#[宏导出]
宏规则!dynmatch{
($e:expr,$(键入$ty:ty{$(arm$pat:pat=>$result:expr),*,=>$any:expr}),*,=>$end:expr)=>(
$(
如果让一些(e)=$e.downcast_ref:(){
匹配e{
$(
$pat=>{$result}
)*
_=>$any
}
}否则
)*
{$end}
);
}
在我尝试添加火柴之前,它一直运行良好。当我尝试在模式中使用“if”语句时,它给出了错误
没有规则需要标记“if”

let_i=匹配示例(2){
好的(i)=>i,
错误(e)=>{
dynmatch!(e,
类型ExampleError1{
arm示例错误1::此错误(2)=>恐慌!(“是2!”),
_=>恐慌!(“{}”,e)
},
输入示例Error2{
arm ExampleError2::ThatError(8)=>恐慌!(“是8!”),
arm示例错误2::该错误(9..=11)=>10,
_=>恐慌!(“{}”,e)
}, 
类型std::io::错误{
arm i if i.kind()==std::io::ErrorKind::NotFound=>panic!(“未找到”),//错误没有规则需要标记'if'`
_=>恐慌!(“{}”,e)
},
_=>恐慌!(“{}”,e)
)
}
};

有没有办法在模式匹配中使用match Guard而不会出现令牌错误?

当然,即使我花了一个小时寻找解决方案,但在我发布这个问题后,我马上找到了答案

正确的宏如下所示:

#[macro_export]
macro_rules! dynmatch {
    ($e:expr, $(type $ty:ty {$(arm $( $pattern:pat )|+ $( if $guard: expr )? => $result:expr),*, _ => $any:expr}),*, _ => $end:expr) => (
        $(
            if let Some(e) = $e.downcast_ref::<$ty>() {
                match e {
                    $(
                        $( $pattern )|+ $( if $guard )? => {$result}
                    )*
                    _ => $any
                }
            } else
        )*
        {$end}
    );
}
#[宏导出]
宏规则!dynmatch{
($e:expr,$(键入$ty:ty{$(arm$($pattern:pat)|+$(如果$guard:expr)?=>$result:expr),*,=>$any:expr}),*,=>$end:expr)=>(
$(
如果让一些(e)=$e.downcast_ref:(){
匹配e{
$(
$($pattern)|+$(如果$guard)?=>{$result}
)*
_=>$any
}
}否则
)*
{$end}
);
}

要归功于锈线244-251,当然,尽管我花了一个小时寻找解决方案,但在我发布这个问题后,我马上找到了答案

正确的宏如下所示:

#[macro_export]
macro_rules! dynmatch {
    ($e:expr, $(type $ty:ty {$(arm $( $pattern:pat )|+ $( if $guard: expr )? => $result:expr),*, _ => $any:expr}),*, _ => $end:expr) => (
        $(
            if let Some(e) = $e.downcast_ref::<$ty>() {
                match e {
                    $(
                        $( $pattern )|+ $( if $guard )? => {$result}
                    )*
                    _ => $any
                }
            } else
        )*
        {$end}
    );
}
#[宏导出]
宏规则!dynmatch{
($e:expr,$(键入$ty:ty{$(arm$($pattern:pat)|+$(如果$guard:expr)?=>$result:expr),*,=>$any:expr}),*,=>$end:expr)=>(
$(
如果让一些(e)=$e.downcast_ref:(){
匹配e{
$(
$($pattern)|+$(如果$guard)?=>{$result}
)*
_=>$any
}
}否则
)*
{$end}
);
}
应记入锈线244-251