You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 09:45:00