[英]Is there a way to match on all variants of an enum in rust?
有没有与此等效的东西:
enum ABC {
A(u32),
B(i32),
C(f64),
}
fn main() {
let abc = ABC::A(42);
match abc {
_(foo) => foo,
}
}
我问的原因是有时,我想为不同的可能类型使用枚举,但大多数情况下我需要以完全相同的方式处理枚举变体中的数据。
如果您想匹配所有可能的变体并执行常见操作,您可以为其编写宏并减少代码重复:
enum ABC {
A(u32),
B(i32),
C(f64),
}
#[macro_use]
macro_rules! per_letter {
($val:expr, $pattern:pat => { $res:expr }) => (
match $val {
$crate::ABC::A($pattern) => $res,
$crate::ABC::B($pattern) => $res,
$crate::ABC::C($pattern) => $res,
}
)
}
impl ABC {
pub fn print_inner(&self) {
per_letter!(self, letter => {println!("{}", letter)});
}
pub fn print_quad(&self) {
per_letter!(self, letter => {println!("{}", *letter**letter)});
}
}
请注意,这是有限的。 如果不将它们包装在枚举中,就不能有多种可能的返回类型。 但是,如果您的内部类型共享一个通用功能,它仍然很有用。
fn main() {
let foo = ABC::A(2);
foo.print_inner();
foo.print_quad();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.