rust 如何编写自定义派生宏?

5vf7fwbs  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(259)

我正在尝试用Rust编写自己的派生模式宏,有关它的文档中缺少一些示例。
我有一个结构体:


# [derive(MyMacroHere)]

struct Example {
    id: i64,
    value: Option<String>,
}

我想让我的宏生成一个方法

fn set_fields(&mut self, id: i64, value: Option<String>) {
    // ...
}

使用TokenStream特征实现类似的功能的基本步骤是什么?

ukdjmx9f

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>,
}

困难的部分是宏的实现。大多数人使用synquote板条箱来解析传入的Rust代码,然后生成新代码。
例如,syn的文档从一个自定义派生的例子开始,你将解析结构体(或枚举或联合),然后处理定义结构体的各种方法(单元、元组、命名字段),你将收集你需要的信息(类型,可能是名称),然后你将生成适当的代码。
另请参阅:

相关问题