我正在尝试用Rust编写自己的派生模式宏,有关它的文档中缺少一些示例。我有一个结构体:
# [derive(MyMacroHere)] struct Example { id: i64, value: Option<String>, }
我想让我的宏生成一个方法
fn set_fields(&mut self, id: i64, value: Option<String>) { // ... }
使用TokenStream特征实现类似的功能的基本步骤是什么?
TokenStream
ukdjmx9f1#
1.为过程宏创建一个板条箱:
cargo new my_derive --lib
1.编辑Cargo.toml,使其成为一个过程化宏框:
[lib] proc-macro = true
1.实作程序宏:
extern crate proc_macro; use proc_macro::TokenStream; # [proc_macro_derive(MyMacroHere)] pub fn my_macro_here_derive(input: TokenStream) -> TokenStream { // ... }
1.导入程序宏并使用它:
extern crate my_derive; use my_derive::MyMacroHere; # [derive(MyMacroHere)] struct Example { id: i64, value: Option<String>, }
困难的部分是宏的实现。大多数人使用syn和quote板条箱来解析传入的Rust代码,然后生成新代码。例如,syn的文档从一个自定义派生的例子开始,你将解析结构体(或枚举或联合),然后处理定义结构体的各种方法(单元、元组、命名字段),你将收集你需要的信息(类型,可能是名称),然后你将生成适当的代码。另请参阅:
derive
proc_macro
syn
quote
1条答案
按热度按时间ukdjmx9f1#
1.为过程宏创建一个板条箱:
1.编辑Cargo.toml,使其成为一个过程化宏框:
1.实作程序宏:
1.导入程序宏并使用它:
困难的部分是宏的实现。大多数人使用syn和quote板条箱来解析传入的Rust代码,然后生成新代码。
例如,syn的文档从一个自定义派生的例子开始,你将解析结构体(或枚举或联合),然后处理定义结构体的各种方法(单元、元组、命名字段),你将收集你需要的信息(类型,可能是名称),然后你将生成适当的代码。
另请参阅:
derive
宏proc_macro
syn
quote