Rust中Strum库实现枚举

 更新时间:2026年06月17日 09:07:49   作者:Rust研习社  
很多Rust新手都知道可以通过派生宏来扩展枚举的能力,但其实 Rust 社区有一个非常流行的 Enum 增强库——Strum,通过它提供的宏能帮我们解决开发过程中很多的痛点,感兴趣的可以了解一下

很多 Rust 新手都知道可以通过派生宏来扩展枚举的能力,但其实 Rust 社区有一个非常流行的 Enum 增强库——Strum,通过它提供的宏能帮我们解决开发过程中很多的痛点。

当前痛点

在 Rust 中,枚举是一个非常强大的特性,很多语言里的枚举只是几个整数常量:

enum Color { RED, GREEN, BLUE };

而 Rust 的枚举不仅可以携带数据,还能用于状态机、错误处理、协议建模等场景。但还是不够方便,比如:

  • 枚举转字符串
  • 字符串转枚举
  • 遍历所有枚举值
  • ...

这些功能如果自己手写,那么就需要手写很多样板代码,说实话挺麻烦的。而这时候就是强大的出场的时候了,接下来我们将通过一些使用场景来介绍 Strum 的用法。

首先,我们先在 Cargo.toml 添加上 strum 依赖:

[dependencies]
strum = { version = "0.28", features = ["derive"] }

场景一:枚举转字符串

有这么一个枚举:

enum Status { 
    Pending, 
    Running, 
    Finished, 
}

如果需要将枚举转换成字符串,那么一般是通过实现 Display 特征来实现:

use std::fmt;

enum Status {
    Pending,
    Running,
    Finished,
}

impl fmt::Display for Status {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            Status::Pending => write!(f, "pending"),
            Status::Running => write!(f, "running"),
            Status::Finished => write!(f, "finished"),
        }
    }
}

fn main() {
    println!("{}", Status::Pending);
    println!("{}", Status::Running);
    println!("{}", Status::Finished);
}

而使用 Strum 的 Display 派生宏来实现则非常简单:

use strum::Display;

#[derive(Display)]
enum Status {
    #[strum(serialize = "pending")]
    Pending,
    #[strum(serialize = "running")]
    Running,
    #[strum(serialize = "finished")]
    Finished,
}

fn main() {
    println!("{}", Status::Pending);
    println!("{}", Status::Running);
    println!("{}", Status::Finished);
}

本质上就是 Strum 自动帮我们实现了 Display 特征,说白了就是自动生成这些样板代码。

场景二:字符串转枚举

依旧是这个枚举:

enum Status {
    Pending,
    Running,
    Finished,
}

假设我们现在需要将 pending 字符串转换为对应的枚举,那么可以通过实现 FromStr 特征来实现:

use std::str::FromStr;

#[derive(Debug)]
enum Status {
    Pending,
    Running,
    Finished,
}

impl FromStr for Status {
    type Err = String;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        match s {
            "pending" => Ok(Status::Pending),
            "running" => Ok(Status::Running),
            "finished" => Ok(Status::Finished),
            _ => Err("invalid".into()),
        }
    }
}

fn main() {
    println!("{:?}", "pending".parse::<Status>());
    println!("{:?}", "running".parse::<Status>());
    println!("{:?}", "finished".parse::<Status>());
}

这里可以使用 Strum 的 EnumString 派生宏来进行简化:

use strum::EnumString;

#[derive(Debug, EnumString)]
enum Status {
    #[strum(serialize = "pending")]
    Pending,
    #[strum(serialize = "running")]
    Running,
    #[strum(serialize = "finished")]
    Finished,
}

fn main() {
    println!("{:?}", "pending".parse::<Status>());
    println!("{:?}", "running".parse::<Status>());
    println!("{:?}", "finished".parse::<Status>());
}

场景三:遍历所有枚举值

一般情况下,如果我们想遍历枚举值,得专门构建出一个枚举数组来使用,比如:

fn all_status() -> Vec<Status> {
    vec![
        Status::Running,
        Status::Finished,
        Status::Cancelled,
    ]
}

其实这样挺麻烦的,万一有新增或减少枚举值,还得同步进行修改。而使用 Strum 的 EnumIter 派生宏就能解决这个问题:

use strum::{EnumIter, IntoEnumIterator};

#[derive(Debug, EnumIter)]
enum Status {
    Pending,
    Running,
    Finished,
}

fn main() {
    for status in Status::iter() {
        println!("{:?}", status);
    }
}

结语

在这篇文章里,虽然我只讲了三种用法,但是其实已经覆盖了 90% 的 Strum 使用场景了,感兴趣的读者可以自行阅读 Strum 官方文档继续探索。

不过,比起 Strum 本身,我更希望大家关注的是如何善用宏来消除重复代码

很多 Rust 新手在学习时会下意识地避开宏,确实它很难,但你会发现宏不单是 Rust 的高级技巧,还是写出地道 Rust 代码的关键手段之一。Rust 生态中最优秀的库几乎都在使用宏写出更简洁、更安全、更易维护的代码。

到此这篇关于Rust中Strum库实现枚举的文章就介绍到这了,更多相关Rust Strum枚举内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Rust读取配置文件的实现

    Rust读取配置文件的实现

    本文主要介绍了Rust读取配置文件的实现,主要读取Cargo.toml文件,读取.env文件和读取自定义toml文件这三种,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Rust 语言中的 into() 方法及代码实例

    Rust 语言中的 into() 方法及代码实例

    在 Rust 中,into() 方法通常用于将一个类型的值转换为另一个类型,这通常涉及到资源的所有权转移,本文给大家介绍Rust 语言中的 into() 方法及代码实例,感谢的朋友跟随小编一起看看吧
    2024-03-03
  • Rust中多线程 Web 服务器的项目实战

    Rust中多线程 Web 服务器的项目实战

    本文主要介绍了Rust中多线程 Web 服务器的项目实战,利用通道和互斥锁管理任务队列,解决单线程处理请求的性能瓶颈,确保并发处理能力并实现优雅关闭机制
    2025-06-06
  • 前端基于Rust实现的Wasm进行图片压缩的技术文档(实现方案)

    前端基于Rust实现的Wasm进行图片压缩的技术文档(实现方案)

    在现代Web开发中,利用Rust编写的图片压缩代码可以编译成WebAssembly(Wasm)模块,Rust的内存安全特性和Wasm的跨平台能力,使得这种方案既高效又安全,对Rust Wasm图片压缩实现方案感兴趣的朋友一起看看吧
    2024-09-09
  • Rust如何使用Sauron实现Web界面交互

    Rust如何使用Sauron实现Web界面交互

    Sauron 是一个多功能的 Web 框架和库,用于构建客户端和/或服务器端 Web 应用程序,重点关注人体工程学、简单性和优雅性,这篇文章主要介绍了Rust使用Sauron实现Web界面交互,需要的朋友可以参考下
    2024-03-03
  • Rust初体验:手把手教你构建‘Hello, World!’

    Rust初体验:手把手教你构建‘Hello, World!’

    "准备好了吗?一起踏上Rust编程语言的精彩旅程!在这篇「Rust初体验」中,我们将手把手教你构建经典程序“Hello, World!”,感受Rust的强大与安全,短短几行代码,就能让你对这个系统级语言的魅力一探究竟!快加入吧,惊喜等你发现!"
    2024-01-01
  • Rust在写库时实现缓存的操作方法

    Rust在写库时实现缓存的操作方法

    Moka是一个用于Rust的高性能缓存库,它提供了多种类型的缓存数据结构,包括哈希表、LRU(最近最少使用)缓存和 支持TTL(生存时间)缓存,这篇文章给大家介绍Rust在写库时实现缓存的相关知识,感兴趣的朋友一起看看吧
    2024-01-01
  • Rust 高性能内存缓存 moka 完全指南

    Rust 高性能内存缓存 moka 完全指南

    本文介绍了Rust高性能内存缓存库moka,涵盖其核心特性、基础环境搭建、同步/异步实战、高级配置及生产环境最佳实践等内容,感兴趣的可以了解一下
    2026-05-05
  • Rust可迭代类型迭代器正确创建自定义可迭代类型的方法

    Rust可迭代类型迭代器正确创建自定义可迭代类型的方法

    在 Rust 中, 如果一个类型实现了 Iterator, 那么它会被同时实现 IntoIterator, 具体逻辑是返回自身, 因为自身就是迭代器,这篇文章主要介绍了Rust可迭代类型迭代器正确创建自定义可迭代类型的方法,需要的朋友可以参考下
    2023-12-12
  • Rust+React创建富文本编辑器

    Rust+React创建富文本编辑器

    这篇文章主要为大家介绍了Rust+React创建富文本编辑器示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07

最新评论