如何编写自定义派生宏?

时间:2018-11-03 22:07:34

标签: rust rust-macros

我正在尝试在Rust中编写自己的派生模式宏,示例中缺少documentation

我有一个类似的结构:

#[derive(MyMacroHere)]
struct Example {
    id: i64,
    value: Option<String>,
}

我希望我的宏生成àla

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

使用TokenStream特征来实现类似目标的基本步骤是什么?

1 个答案:

答案 0 :(得分:2)

  1. 为您的程序宏创建一个板条箱:

    cargo new my_derive --lib
    
  2. 编辑Cargo.toml以使其成为程序宏板条箱:

    [lib]
    proc-macro = true
    
  3. 实现您的程序宏:

    extern crate proc_macro;
    
    use proc_macro::TokenStream;
    
    #[proc_macro_derive(MyMacroHere)]
    pub fn my_macro_here_derive(input: TokenStream) -> TokenStream { 
        // ...
    }
    
  4. 导入过程宏并使用它:

    extern crate my_derive;
    
    use my_derive::MyMacroHere;
    
    #[derive(MyMacroHere)]
    struct Example {
        id: i64,
        value: Option<String>,
    }
    

最困难的部分是宏的实现。大多数人使用synquote条板箱来分析传入的Rust代码,然后生成新代码。

例如,syn的文档以an example of a custom derive开始。您将解析结构(或枚举或联合),然后处理定义结构的各种方式(单位,元组,命名字段)。您将收集所需的信息(类型,也许是名称),然后生成适当的代码。

另请参阅: