需求:
获取枚举类型附加信息,如备注说明,传统作法如下:
实现 comment 方法根据匹配值返回对应字符串
传统作法有一个问题,如果有很多枚举,就需要各自实现对应的 comment 方法实现,很麻烦,是否可以简化呢?
可以的!
其中 comment 方法的实现就属于模板代码。这种重复性的工作就可以考虑使用宏,最终简化如下:
除了 comment 也可以附加 其它信息如 姓名、年龄等
什么是过程宏
过程宏中文文档参考: https://zjp-cn.github.io/rust-note/proc/quote.html
过程宏(Procedure Macro)
是 Rust 中的一种特殊形式的宏,提供比普通宏更强大的功能。过程宏主要分三类:
- 派生宏(Derive macro):用于结构体(struct)、枚举(enum)、联合(union)类型,可为其实现函数或特征(Trait)。
- 属性宏(Attribute macro):用在结构体、字段、函数等地方,为其指定属性等功能。如标准库中的#[inline]、#[derive(...)]等都是属性宏。
- 函数式宏(Function-like macro):用法与普通的规则宏类似,但功能更加强大,可实现任意语法树层面的转换功能。
1.派生宏示例:
其使用方法如下:
2.属性宏示例
其使用方法如下:
3.函数式宏示例
其使用方法如下:
功能实现
本例主要使用派生宏实现
项目创建可以参数示例仓库 https://github.com/imbolc/rust-derive-macro-guide
第一步 创建测试项目
测试项目: my-macro-test
宏项目: my-derives
项目结构最终如下:
文件 my-macro-test/Cargo.toml
文件 my-macro-test/my-derives/Cargo.toml
重要的第三方库:
- quote 把 Rust 语法树的数据结构转化为源代码的标记 (tokens)
- syn 主要是一个解析库,用于把 Rust 标记流解析为 Rust 源代码的语法树
- bae 简化属性数据的处理
第二步 自定义属性定义
文件: my-derives/attributes.rs
第三步 HelloMacro 派生宏实现
文件: my-derives/lib.rs
#(#comment_arms),*
为数据解构语法,具体参考:https://docs.rs/quote/1.0.21/quote/macro.quote.html
第四步 测试代码实现
文件: my-macro-test/main.rs
cargo run 运行测试输出结果如注释部分。