我正在尝试在Rust中编写自己的派生模式宏,示例中缺少documentation。
我有一个类似的结构:
#[derive(MyMacroHere)]
struct Example {
id: i64,
value: Option<String>,
}
我希望我的宏生成àla
方法fn set_fields(&mut self, id: i64, value: Option<String>) {
// ...
}
使用TokenStream
特征来实现类似目标的基本步骤是什么?
答案 0 :(得分:2)
为您的程序宏创建一个板条箱:
cargo new my_derive --lib
编辑Cargo.toml以使其成为程序宏板条箱:
[lib]
proc-macro = true
实现您的程序宏:
extern crate proc_macro;
use proc_macro::TokenStream;
#[proc_macro_derive(MyMacroHere)]
pub fn my_macro_here_derive(input: TokenStream) -> TokenStream {
// ...
}
导入过程宏并使用它:
extern crate my_derive;
use my_derive::MyMacroHere;
#[derive(MyMacroHere)]
struct Example {
id: i64,
value: Option<String>,
}
最困难的部分是宏的实现。大多数人使用syn和quote条板箱来分析传入的Rust代码,然后生成新代码。
例如,syn的文档以an example of a custom derive开始。您将解析结构(或枚举或联合),然后处理定义结构的各种方式(单位,元组,命名字段)。您将收集所需的信息(类型,也许是名称),然后生成适当的代码。
另请参阅: