【quantity】5 derive_more库 2.0 版介绍
derive_more 是一个 Rust 过程宏库,旨在通过派生宏自动生成常见 trait 的实现,减少样板代码。2.0 版本带来了多项改进和新特性。
主要特性
1. 支持的 Trait 派生
derive_more 2.0 支持派生以下 trait:
基本操作 trait:
-
Display - 格式化显示
-
Debug - 调试输出
-
From/Into - 类型转换
-
FromStr - 从字符串解析
-
Index/IndexMut - 索引操作
-
Deref/DerefMut - 解引用操作
-
Constructor - 简化结构体构造
算术运算 trait:
-
Add/AddAssign - 加法
-
Sub/SubAssign - 减法
-
Mul/MulAssign - 乘法
-
Div/DivAssign - 除法
-
Rem/RemAssign - 取余
-
Neg - 取负
-
Not - 逻辑非
-
BitAnd/BitAndAssign - 按位与
-
BitOr/BitOrAssign - 按位或
-
BitXor/BitXorAssign - 按位异或
-
Shl/ShlAssign - 左移
-
Shr/ShrAssign - 右移
2. 2.0 版本新特性
-
性能优化:减少了编译时间和生成的代码量
-
更好的错误信息:更清晰的编译错误提示
-
更灵活的配置:通过属性提供更多自定义选项
-
支持更多 trait:新增了几个常用 trait 的派生支持
-
改进的文档:更详细的文档和示例
使用示例
基本使用
use derive_more::{Display, From, Add};#[derive(Display, From, Add)]
struct MyInt(i32);let my_int = MyInt(10);
println!("{}", my_int); // 输出: 10
let sum = my_int + MyInt(20); // 可以使用加法
自定义显示格式
use derive_more::Display;#[derive(Display)]
#[display(fmt = "({}, {})", x, y)]
struct Point {x: i32,y: i32,
}println!("{}", Point { x: 1, y: 2 }); // 输出: (1, 2)
枚举支持
use derive_more::{Display, From};#[derive(Display, From)]
enum MyEnum {#[display(fmt = "Int: {}", _0)]Int(i32),#[display(fmt = "Float: {}", _0)]Float(f64),
}println!("{}", MyEnum::Int(10)); // 输出: Int: 10
println!("{}", MyEnum::Float(3.14)); // 输出: Float: 3.14
运算符重载
use derive_more::{Add, Mul};#[derive(Add, Mul, Clone, Copy)]
struct Vec2 {x: f64,y: f64,
}let v1 = Vec2 { x: 1.0, y: 2.0 };
let v2 = Vec2 { x: 3.0, y: 4.0 };
let sum = v1 + v2; // Vec2 { x: 4.0, y: 6.0 }
let product = v1 * v2; // Vec2 { x: 3.0, y: 8.0 }
配置选项
derive_more 提供了多种属性来自定义派生行为:
-
#[display(fmt = “…”)] - 自定义显示格式
-
#[from(forward)] - 转发 From 实现
-
#[from(skip)] - 跳过某些 From 实现
-
#[add(forward)] - 转发加法操作
-
#[mul(forward)] - 转发乘法操作
与标准库的比较
derive_more 相比手动实现或使用标准库的派生有以下优势:
-
减少样板代码:自动生成大量重复的 trait 实现
-
一致性:确保所有相关 trait 实现行为一致
-
灵活性:提供更多自定义选项
-
扩展性:支持标准库没有的 trait 组合
适用场景
-
需要为自定义类型实现多个 trait 时
-
需要快速原型开发时
-
当 trait 实现逻辑相对简单直接时
-
当需要确保一组相关 trait 实现一致时
注意事项
-
对于复杂逻辑的 trait 实现,可能需要手动实现
-
某些 trait 组合可能有冲突,需要注意编译错误
-
生成的代码可能不如手动优化的代码高效
derive_more 2.0 通过提供更强大、更灵活的派生宏,显著简化了 Rust 中常见 trait 的实现工作。