tl;dr在match
的语句enum
,如何将该子变量分配给变量?
鉴于enum
这些
enum MySubVariant {
A,
B,
C,
}
enum MyEnum {
X { variant: MySubVariant },
Y { variant: MySubVariant },
Z,
}
fn main() {
let x = MyEnum::X { variant: MySubVariant::A };
match x {
MyEnum::X { variant: MySubVariant::A }
| MyEnum::X { variant: MySubVariant::B }
| MyEnum::Y { variant: MySubVariant::A }
| MyEnum::Y { variant: MySubVariant::B }
=> {
// do something unique for A or B
match x {
MyEnum::X { variant } => {
print!("the variant was ");
match variant {
MySubVariant::A => println!("A"),
MySubVariant::B => println!("B"),
_ => unreachable!(),
}
}
_ => unreachable!(),
}
}
MyEnum::X { variant: MySubVariant::C }
| MyEnum::Y { variant: MySubVariant::C }
=> {
// do something unique for C
print!("the variant was ");
match x {
MyEnum::X { variant } | MyEnum::Y { variant } => {
match variant {
MySubVariant::A => println!("A"),
MySubVariant::B => println!("B"),
MySubVariant::C => println!("C"),
}
}
_ => unreachable!(),
}
}
MyEnum::Z => println!("Z"),
}
}
我想访问variant
匹配语句中的子变体。我想match
用变量替换内部语句。
这是我想要的人为(且无效)的代码:
fn main() {
let x = MyEnum::X { variant: MySubVariant::A };
match x {
MyEnum::X { variant: MySubVariant::A } where v = variant
| MyEnum::X { variant: MySubVariant::B } where v = variant
| MyEnum::Y { variant: MySubVariant::A } where v = variant
| MyEnum::Y { variant: MySubVariant::B } where v = variant
=> {
// do something unique for A or B
println!("the variant was {:?}", v);
}
MyEnum::X { variant: MySubVariant::C } where v = variant
| MyEnum::Y { variant: MySubVariant::C } where v = variant
=> {
// do something unique for C
println!("the variant was {:?}", v);
}
MyEnum::Z => println!("Z"),
}
}
请注意,内部语句用人为的代码match
替换了变量。v
where v = variant
如何简化这些match
语句以轻松访问variant
子变体?