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 的實現工作。