使用JDK8开发应用的时候,经常会用到Lombok中的一些注解功能,比如使用@Data
来生成类成员的Get/Set 方法。
今天尝试下使用Rust中的过程宏来实现类似功能。
流程:
parse_macro_input
解析DeriveInput
format_ident!
拼接生成函数名称quote!
生成TokenStream段稍微复杂点就是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()); }
哪些 云服务器 能免费试用?目前市场面上提供 云服务器 试用的厂商其实不少,但...
5月20-22日,第十三届中国系统架构师大会(SACC2021)在云端进行网络直播,主题...
公司简介 北京智启蓝墨信息技术有限公司(以下简称蓝墨)成立于2012年,地处北京...
域名 在哪里购买?不管是新 注册域名 ,还是购买已注册域名,首先都需要选择一家...
问题背景 对于一些特殊的软件,必须在指定Linux内核版本才能很好地支持,这时就...
1. 接口描述 接口请求域名: cvm.tencentcloudapi.com 。 本接口 (ModifyKeyPair...
数字经济时代,大数据带来的诸多便利得益于被誉为万能粮仓的数据中心。数据中心...
今天随便聊聊一个Susan在2017年发在Science上文章:Beyond prediction: Using bi...
1 前言 HDFS(Hadoop Distributed File System)是我们熟知的Hadoop分布式文件系统...
域名 有没有实名怎么看?目前由于隐私保护的原因,域名有没有实名认证成功,只能...