Rust中无需穷举枚举变体提取内部结构体的方法
解决方案
有两种简洁的方式可以不用每次穷举所有枚举变体来提取CakeInfo的字段:
1. 给枚举实现一个获取CakeInfo的方法(推荐)
一次性在枚举的实现里写好匹配逻辑,之后随时调用即可,不用重复写match:
struct CakeInfo { best_by: String, cost_pence: i32, calories: i32, } enum CakeCategory{ Chocolate(CakeInfo), Sponge(CakeInfo), Fruit(CakeInfo), } impl CakeCategory { // 返回不可变引用,避免不必要的所有权转移 fn info(&self) -> &CakeInfo { match self { CakeCategory::Chocolate(info) => info, CakeCategory::Sponge(info) => info, CakeCategory::Fruit(info) => info, } } // 如果需要修改内部字段,可以加一个可变版本 fn info_mut(&mut self) -> &mut CakeInfo { match self { CakeCategory::Chocolate(info) => info, CakeCategory::Sponge(info) => info, CakeCategory::Fruit(info) => info, } } } // 使用示例 fn main() { let mut cake = CakeCategory::Sponge(CakeInfo { best_by: "2024-11-01".to_string(), cost_pence: 120, calories: 350, }); // 访问字段 println!("Best by: {}", cake.info().best_by); // 修改字段(用可变引用方法) cake.info_mut().cost_pence = 130; println!("Updated cost: {}p", cake.info().cost_pence); }
2. 使用Rust的或模式(Or Patterns)
如果只是临时需要提取字段,可以用或模式在match语句中一次性匹配所有变体,避免重复写相同的处理逻辑(需要Rust 1.53及以上版本支持):
// 假设已有定义好的CakeInfo和CakeCategory fn main() { let cake = CakeCategory::Fruit(CakeInfo { best_by: "2024-12-31".to_string(), cost_pence: 180, calories: 280, }); // 一次匹配所有变体,直接提取best_by字段 let best_by = match cake { CakeCategory::Chocolate(info) | CakeCategory::Sponge(info) | CakeCategory::Fruit(info) => info.best_by, }; println!("Fruit cake best by: {}", best_by); }
为什么_(cake_info)不行?
Rust的match要求模式必须明确覆盖所有可能的枚举变体,而且_是通配符,用来匹配任意值但不会绑定变量到cake_info,所以没法用它来捕获枚举变体里的结构体。必须明确写出每个变体的模式,要么通过或模式合并,要么封装到枚举方法里。
内容的提问来源于stack exchange,提问作者SonofaBleepBloop
相关产品推荐
相关产品推荐

