程序员

Rust 过程宏简单仿写Lombok 功能

作者:admin 2021-06-27 我要评论

概念 使用JDK8开发应用的时候,经常会用到Lombok中的一些注解功能,比如使用 @Data 来生成类成员的Get/Set 方法。 今天尝试下使用Rust中的过程宏来实现类似功能...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

概念

使用JDK8开发应用的时候,经常会用到Lombok中的一些注解功能,比如使用@Data来生成类成员的Get/Set 方法。

今天尝试下使用Rust中的过程宏来实现类似功能。

实践

流程:

  1. 使用Syn库中的parse_macro_input 解析DeriveInput
  2. 遍历目标对象Fields域
  3. 使用format_ident! 拼接生成函数名称
  4. 使用quote库中quote! 生成TokenStream段
  5. 生成目标的impl方法

稍微复杂点就是quote子段,附加到主lombok_data_fun的过程。

具体看例子:

// lib.rs
#[proc_macro_derive(Data)]
pub fn lombok_data(input: TokenStream)->TokenStream {
    let input = parse_macro_input!(input as DeriveInput);
    let data = input.data;

    let mut lombok_data_fun= quote! { };
    match data {
        Data::Struct(s)=>{
            // 遍历成员
            for f in s.fields{
                let attr_name = f.ident.to_token_stream();
                let attr_ty = f.ty.to_token_stream();
				// 拼接函数名称
                let get_name =  format_ident!("get_{}", attr_name.to_string());
                let set_name =  format_ident!("set_{}", attr_name.to_string());
                let t = quote! {
                    pub fn #get_name(&self)->&#attr_ty{
                        &self.#attr_name
                    }
                    pub fn #set_name(&mut self, val:#attr_ty){
                        self.#attr_name = val
                    }
                };
				// 由子段拼接成主段
                lombok_data_fun = quote! {
                    #lombok_data_fun 
                    #t
                }
            }
        },
        _=>()
    }
	// 获取结构名称
    let name = input.ident.to_token_stream();
    let  expanded = quote! {
        impl #name {
            #lombok_data_fun
        }
    };
    expanded.into()

}


// main.rs
#[derive(Data)]
struct LombokTest {
    name: String,
    age : i32,
}

fn main() {

    let mut test = LombokTest {
        name: "Baby".to_string(),
        age: 10,
    };
    test.set_name("张三".to_string());
    println!("{}", test.get_name());
}

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 阿里巴巴DevOps实践指南(八)| 以特性

    阿里巴巴DevOps实践指南(八)| 以特性

  • 阿里巴巴DevOps实践指南(五)| 业务驱

    阿里巴巴DevOps实践指南(五)| 业务驱

  • RISC-V工具链简介

    RISC-V工具链简介

  • 变局时代:RISC-V处理器架构的技术演变

    变局时代:RISC-V处理器架构的技术演变

腾讯云代理商
精彩导读
海外云服务器
热门资讯
腾讯云代理商