如何以Rust惯用简洁方式查找集合中的特定枚举变体?
解决方案
你可以直接利用Rust的模式匹配结合迭代器的find()方法实现需求,完全不需要为A或B派生Eq/PartialEq特性,只判断枚举变体类型即可:
完整代码示例
struct A { x: i64 } struct B { x: f64 } enum E { One(A), Two(B), // 可添加其他变体 } fn main() { let v = vec![ E::One(A { x: 10 }), E::Two(B { x: 5.0 }), E::One(A { x: 20 }), ]; // 查找第一个E::Two变体的元素 let found = v.iter().find(|&&item| matches!(item, E::Two(_))); // 处理查找结果 match found { Some(E::Two(b)) => println!("找到E::Two变体,内部x值为: {}", b.x), Some(_) => unreachable!("find只会返回E::Two变体"), None => println!("未找到E::Two变体"), } }
关键说明
matches!宏的作用:闭包里用matches!(item, E::Two(_))判断元素是否为E::Two变体,_表示忽略内部的B结构体数据,完全贴合你“只关心变体类型”的需求。- 无额外trait依赖:整个实现不需要为
A、B实现任何比较特性,避免过度设计和潜在问题。 - Rust惯用风格:用
iter()获取不可变迭代器,find()返回第一个匹配元素的引用(Option<&E>),完全遵循迭代器的惯用写法。
如果需要获取可变引用,只需把iter()替换为iter_mut(),对应返回值为Option<&mut E>。
内容的提问来源于stack exchange,提问作者John Perry
相关产品推荐
相关产品推荐

