当前位置:主页 > 查看内容

Rust 过程宏简单仿写Lombok 功能

发布时间:2021-06-27 00:00| 位朋友查看

简介:概念 使用JDK8开发应用的时候,经常会用到Lombok中的一些注解功能,比如使用 @Data 来生成类成员的Get/Set 方法。 今天尝试下使用Rust中的过程宏来实现类似功能。 实践 流程: 使用Syn库中的 parse_macro_input 解析 DeriveInput 遍历目标对象Fields域 使用……

概念

使用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());
}

本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!
上一篇:函数是一等公民,这到底在说什么? 下一篇:没有了

推荐图文


随机推荐