Rust中如何在match语句里将枚举子变体赋值给变量?
简化嵌套Enum的Match语句,直接访问子变体
针对你给出的Enum结构,想要避免嵌套Match并直接将子变体绑定到变量,可以通过Rust模式匹配中的@绑定符号来实现,以下是几种简洁的写法:
方法一:在模式中直接绑定并合并分支
利用@符号将子变体绑定到变量,同时用|合并MyEnum::X和MyEnum::Y的同组子变体分支,既能减少冗余,又能直接访问子变体:
#[derive(Debug)] enum MySubVariant { A, B, C, } #[derive(Debug)] enum MyEnum { X { variant: MySubVariant }, Y { variant: MySubVariant }, Z, } fn main() { let x = MyEnum::X { variant: MySubVariant::A }; match x { // 匹配X/Y中的A或B,绑定子变体到v MyEnum::X { variant: v @ (MySubVariant::A | MySubVariant::B) } | MyEnum::Y { variant: v @ (MySubVariant::A | MySubVariant::B) } => { println!("the variant was {:?}", v); } // 匹配X/Y中的C,绑定子变体到v MyEnum::X { variant: v @ MySubVariant::C } | MyEnum::Y { variant: v @ MySubVariant::C } => { println!("the variant was {:?}", v); } MyEnum::Z => println!("Z"), } }
这里的@符号用于将匹配到的子变体赋值给变量v,|则将多个结构相似的分支合并,完全省去了嵌套Match的冗余。
方法二:先提取子变体,再处理逻辑
如果后续针对子变体的逻辑比较复杂,可以先提取出子变体(包装为Option),再单独对其进行Match,结构更清晰:
fn main() { let x = MyEnum::X { variant: MySubVariant::A }; // 先提取子变体,Z对应None let variant = match x { MyEnum::X { variant } | MyEnum::Y { variant } => Some(variant), MyEnum::Z => None, }; // 针对提取后的子变体处理逻辑 match variant { Some(v @ (MySubVariant::A | MySubVariant::B)) => { println!("the variant was {:?}", v); } Some(v @ MySubVariant::C) => { println!("the variant was {:?}", v); } None => println!("Z"), } }
补充说明
你之前尝试的where子句写法无效,是因为where仅用于添加匹配的条件判断,不能用来赋值变量。变量绑定必须在模式匹配的结构中完成,@符号就是干这个的。
内容的提问来源于stack exchange,提问作者JamesThomasMoon
相关产品推荐
相关产品推荐

