如何通过proc-macro将枚举的所有变体收集到Vec<T>中
Rust 枚举返回所有变体的实现方案
Rust 标准库没有提供原生的枚举变体遍历能力,你可以通过两种常用方案实现需求:
方案1:手动实现(无额外依赖)
适合枚举变体较少、不想引入第三方依赖的场景,直接在方法内枚举所有变体即可。这里建议将方法改为关联函数,不需要依赖枚举实例即可调用:
pub enum MyEnum { EnumVariant1, EnumVariant2, EnumVariant3, } impl MyEnum { fn values() -> Vec<Self> { vec![ Self::EnumVariant1, Self::EnumVariant2, Self::EnumVariant3, ] } } // 调用示例 fn main() { let all_variants = MyEnum::values(); println!("变体数量:{}", all_variants.len()); }
如果你的枚举变体携带字段,为每个字段构造合法值填入即可。
该方案的优缺点:
- 优点:无额外依赖,实现逻辑完全可控
- 缺点:枚举变体新增/删除时需要手动修改
values方法,容易遗漏
方案2:过程宏批量实现(适合多枚举场景)
如果你有大量枚举需要实现该能力,可以用strum库的EnumIter派生宏,添加派生后就能自动获得变体迭代器,转成Vec非常方便:
首先在Cargo.toml添加依赖:
[dependencies] strum = { version = "0.25", features = ["derive"] }
使用示例:
use strum::IntoEnumIterator; use strum_macros::EnumIter; #[derive(Debug, EnumIter)] pub enum MyEnum { EnumVariant1, EnumVariant2, EnumVariant3, } fn main() { // 调用iter()获取所有变体的迭代器,collect转Vec即可 let all_variants: Vec<MyEnum> = MyEnum::iter().collect(); for variant in all_variants { println!("{:?}", variant); } }
该方案支持携带字段的枚举,只要字段类型都实现了Default特征即可自动生成构造逻辑,不需要手动编写每个变体的构造代码。
该方案的优缺点:
- 优点:自动化程度高,修改枚举不需要手动调整实现代码,支持复杂枚举结构
- 缺点:需要引入第三方依赖
内容的提问来源于stack exchange,提问作者Alex Vergara
相关产品推荐
相关产品推荐

