作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我有这个宏来匹配多种错误类型的Box<dyn error::Error>
#[macro_export]
macro_rules! dynmatch {
($e:expr, $(type $ty:ty {$(arm $pat:pat => $result:expr),*, _ => $any:expr}),*, _ => $end:expr) => (
$(
if let Some(e) = $e.downcast_ref::<$ty>() {
match e {
$(
$pat => {$result}
)*
_ => $any
}
} else
)*
{$end}
);
}
直到我尝试添加火柴为止,一切都很好。当我尝试在模式中使用“if”语句时,它给我错误
no rules expected the token 'if'
let _i = match example(2) {
Ok(i) => i,
Err(e) => {
dynmatch!(e,
type ExampleError1 {
arm ExampleError1::ThisError(2) => panic!("it was 2!"),
_ => panic!("{}",e)
},
type ExampleError2 {
arm ExampleError2::ThatError(8) => panic!("it was 8!"),
arm ExampleError2::ThatError(9..=11) => 10,
_ => panic!("{}",e)
},
type std::io::Error {
arm i if i.kind() == std::io::ErrorKind::NotFound => panic!("not found"), //ERROR no rules expected the token `if`
_ => panic!("{}", e)
},
_ => panic!("{}",e)
)
}
};
有什么方法可以在我的模式匹配中使用匹配防护而不会出现 token 错误?
最佳答案
当然,即使我花了一个小时寻找解决方案,在我发布此问题后我也找到了答案。
正确的宏如下所示:
#[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}
);
}
归功于 rust
matches! source线244-251
关于error-handling - 宏匹配臂模式 “no rules expected the token ` if`”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63892562/
当我跑qemu-arm -L /usr/arm-linux-gnueabi/ ./foo在码头 Linux 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC
我是一名优秀的程序员,十分优秀!