Rust枚举显示宏库enum-display-macro的使用,为枚举类型自动生成Display trait实现
Rust枚举显示宏库enum-display-macro的使用,为枚举类型自动生成Display trait实现
安装
在项目目录中运行以下Cargo命令:
cargo add enum-display-macro
或者在Cargo.toml中添加以下行:
enum-display-macro = "0.1.4"
使用示例
enum-display-macro库可以帮助你为枚举类型自动生成Display trait的实现,避免了手动为每个枚举值实现Display trait的繁琐工作。
下面是一个完整的示例演示如何使用这个库:
use enum_display_macro::Display;
// 定义一个枚举并使用Display宏
#[derive(Display)]
enum Status {
#[display("成功")]
Success,
#[display("失败")]
Failure,
#[display("处理中")]
Processing,
#[display("未知状态: {0}")]
Unknown(String),
}
fn main() {
let success = Status::Success;
let failure = Status::Failure;
let processing = Status::Processing;
let unknown = Status::Unknown("自定义错误".to_string());
println!("{}", success); // 输出: 成功
println!("{}", failure); // 输出: 失败
println!("{}", processing); // 输出: 处理中
println!("{}", unknown); // 输出: 未知状态: 自定义错误
}
在这个示例中:
- 我们首先通过
use enum_display_macro::Display
导入宏 - 定义一个
Status
枚举并使用#[derive(Display)]
派生宏 - 为每个枚举变体使用
#[display("...")]
属性指定显示格式- 简单变体可以直接指定显示文本
- 带数据的变体可以使用
{0}
等格式占位符
- 在main函数中,我们创建了不同的枚举实例并打印它们
完整示例demo
下面是一个更完整的示例,展示enum-display-macro库的更多功能:
use enum_display_macro::Display;
// 定义HTTP状态码枚举
#[derive(Debug, Display)]
#[display(style = "snake_case")] // 可选的显示风格
enum HttpStatus {
#[display("200 OK")]
Ok,
#[display("404 页面不存在")]
NotFound,
#[display("500 服务器内部错误")]
InternalServerError,
#[display("自定义错误: {0}")]
CustomError(String),
#[display("重定向到: {0}")]
Redirect(&'static str),
}
fn main() {
// 创建各种HTTP状态实例
let ok = HttpStatus::Ok;
let not_found = HttpStatus::NotFound;
let server_error = HttpStatus::InternalServerError;
let custom = HttpStatus::CustomError("数据库连接失败".to_string());
let redirect = HttpStatus::Redirect("https://example.com");
// 打印枚举值
println!("{}", ok); // 输出: 200 OK
println!("{}", not_found); // 输出: 404 页面不存在
println!("{}", server_error); // 输出: 500 服务器内部错误
println!("{}", custom); // 输出: 自定义错误: 数据库连接失败
println!("{}", redirect); // 输出: 重定向到: https://example.com
// 结合Debug trait使用
println!("{:?}", ok); // 输出: Ok
}
功能特点
- 自动为枚举实现
std::fmt::Display
trait - 支持为每个枚举变体自定义显示文本
- 支持带数据变体的格式化显示
- 简单易用,只需添加少量注解
- 可选的显示风格控制
这个库由Zack Kollar (SeedyROM)维护,采用MIT许可证。
1 回复
Rust枚举显示宏库enum-display-macro使用指南
enum-display-macro
是一个Rust库,用于为枚举类型自动生成Display
trait实现,简化枚举值的显示输出。
安装
在Cargo.toml
中添加依赖:
[dependencies]
enum-display-macro = "0.1"
基本用法
use enum_display_macro::Display;
#[derive(Display)]
enum Color {
Red,
Green,
Blue,
}
fn main() {
println!("Color: {}", Color::Red); // 输出: Color: Red
println!("Color: {}", Color::Green); // 输出: Color: Green
}
自定义显示文本
可以为枚举变体指定自定义的显示文本:
#[derive(Display)]
#[display(style = "snake_case")]
enum HttpStatus {
#[display("OK - 200")]
Ok,
#[display("Not Found - 404")]
NotFound,
#[display("Internal Server Error - 500")]
InternalServerError,
}
fn main() {
println!("Status: {}", HttpStatus::Ok); // 输出: Status: OK - 200
println!("Status: {}", HttpStatus::NotFound); // 输出: Status: Not Found - 404
}
格式化选项
库支持多种格式化风格:
#[derive(Display)]
#[display(style = "lowercase")] // 可选: lowercase, UPPERCASE, CamelCase, snake_case等
enum LogLevel {
Error,
Warning,
Info,
Debug,
}
fn main() {
println!("Level: {}", LogLevel::Error); // 输出: Level: error
println!("Level: {}", LogLevel::Debug); // 输出: Level: debug
}
带关联数据的枚举
对于带有关联数据的枚举,可以指定如何显示:
#[derive(Display)]
enum Shape {
#[display("Circle with radius {}")]
Circle(f64),
#[display("Rectangle {}x{}")]
Rectangle(f64, f64),
#[display("Square with side {}")]
Square(f64),
}
fn main() {
println!("{}", Shape::Circle(5.0)); // 输出: Circle with radius 5
println!("{}", Shape::Rectangle(4.0, 3.0)); // 输出: Rectangle 4x3
}
高级用法 - 使用函数格式化
#[derive(Display)]
enum ComplexEnum {
#[display(fmt = "User: {}", format_user)]
User { id: u64, name: String },
}
fn format_user(user: &ComplexEnum) -> String {
if let ComplexEnum::User { id, name } = user {
format!("ID: {}, Name: {}", id, name)
} else {
String::new()
}
}
fn main() {
let user = ComplexEnum::User {
id: 42,
name: "Alice".to_string(),
};
println!("{}", user); // 输出: User: ID: 42, Name: Alice
}
完整示例
// 导入显示宏
use enum_display_macro::Display;
// 基本枚举示例
#[derive(Display)]
enum Fruit {
Apple,
Banana,
Orange,
}
// 自定义显示文本示例
#[derive(Display)]
#[display(style = "UPPERCASE")]
enum Priority {
#[display("HIGHEST")]
High,
#[display("MEDIUM")]
Medium,
#[display("LOW")]
Low,
}
// 带关联数据的枚举示例
#[derive(Display)]
enum Measurement {
#[display("Temperature: {:.1}°C")]
Temperature(f32),
#[display("Humidity: {}%")]
Humidity(u8),
}
// 使用函数格式化的复杂示例
#[derive(Display)]
enum Device {
#[display(fmt = "Mobile: {}", format_mobile)]
Mobile { brand: String, model: String },
#[display("Desktop: {}")]
Desktop(String),
}
fn format_mobile(device: &Device) -> String {
if let Device::Mobile { brand, model } = device {
format!("{} {}", brand, model)
} else {
String::new()
}
}
fn main() {
// 基本用法
println!("Fruit: {}", Fruit::Apple); // 输出: Fruit: Apple
// 自定义文本
println!("Priority: {}", Priority::High); // 输出: Priority: HIGHEST
// 带数据的枚举
println!("{}", Measurement::Temperature(23.5)); // 输出: Temperature: 23.5°C
println!("{}", Measurement::Humidity(65)); // 输出: Humidity: 65%
// 复杂格式化
let phone = Device::Mobile {
brand: "Apple".to_string(),
model: "iPhone 13".to_string(),
};
println!("{}", phone); // 输出: Mobile: Apple iPhone 13
println!("{}", Device::Desktop("Dell XPS".to_string())); // 输出: Desktop: Dell XPS
}
注意事项
- 该宏只能用于枚举类型
- 默认情况下,使用枚举变体的原始名称作为显示文本
- 可以通过属性来自定义显示格式
- 对于带有关联数据的枚举,必须指定格式化方式
这个库可以大大简化枚举类型的显示实现,特别是在需要友好输出或国际化支持的场景中非常有用。