Rust 过程宏简单仿写Lombok 功能

概念

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

原创声明,本文系作者授权云+社区发表。

如有侵权,请联系 yunjia_community@tencent.com 删除。

(0)

相关推荐

  • 前端之jQuery

    jQuery对象 jQuery对象是通过jQuery包装DOM对象后产生的对象 注意:jQuery对象只能使用jQuery里的方法,DOM对象只能使用DOM对象的方法 jQuery基础知识点 查找标签 ...

  • AndOrLogic

    AndOrLogic { Pattern = Pattern.()TokenType { } Token { TokenType String (TokenType typestartString d ...

  • Rust基础学习笔记(零):复习基本知识

    由于一个学期没有碰Rust,相关知识殆已忘尽.最近各课逐渐停授,余出时间来从基础重温这些知识,也算是对没有写的基础知识的补充.另外这次复习主要参照了Youtube上的Crush Course视频,两个 ...

  • 初中数学:这题怎么简便计算?常规套路换元法,再套平方差公式,写起来过程很简单

    初中数学:这题怎么简便计算?常规套路换元法,再套平方差公式.大家先在草稿本上做一遍,然后再看后面的视频.期待你在评论区求留言. 温馨提醒:本<七年级数学>公众号,主要发布七年级数学上册和和 ...

  • 5分钟仿写小练笔,简单易学,教你真正弄懂写作文必会的观察方法

    5分钟仿写小练笔,简单易学,教你真正弄懂写作文必会的观察方法

  • 3.七年级数学:一元一次方程怎么解?要怎么写步骤过程?简单而详细

    七年级数学:一元一次方程怎么解?要怎么写步骤过程?简单而详细.大家先在草稿本上认真地做一遍,然后再看后面的视频.期待你在评论区的留言. 请看视频讲解,觉得不错,请点赞.

  • 手机wps手写签名功能在哪里

    办公时有很多文件需要签名,如果外出遇到比较紧急的情况,就会很麻烦.那手机wps手写签名功能在哪里,下面一起来看看吧. 1.打开wps office,找到需要签名的文件并打开. 2.点击[编辑]进入编辑 ...

  • 仿写作文:一个接一个

    读写训练营 一个接一个 作者:李昕硕,迁安市青少年活动中心文学素养班学生. 指导教师:马志伟 说好的周末去放风筝, 就听妈妈说:"咱们去天元谷办延期!" 唉,我可是把风筝都准备好了 ...

  • 《秋天的怀念》仿写作文

    秋天的怀念     又一个秋天来到了,天气十分凉爽,这似乎与以往的秋天相似,可是,景是人非啊!连秋风都带着淡淡的悲伤. 记得小时候,我总喜欢到秋天的时候去大舅舅家玩儿,因为我每次去,他都给我们丰富的水 ...

  • 《背影》仿写作文2篇

    一碗糖水,念一个人 蓝天怡 小时候在外婆家过年,晚上饿的时候,她总会给我做一碗热腾腾的蛋糖水.倒下一勺子清水,待水沸腾后撒下些许白糖等着它融化.我总是让外婆把我抱起来,两个眼睛骨碌碌地盯着锅里沸腾着的 ...

  • 《走一步再走一步》仿写作文《独特的体验》

    独特的体验 张可柔 此刻,我即将登上弹跳塔,尝试从未经历的挑战,内心无比煎熬. 双脚一步步走向座椅,恐惧已经到达了极点,这一定是我的自尊心在作祟.护栏缓缓落下,安全带紧紧地缚住我,这时我才发觉,已无法 ...

  • 看着丑吃着香的多宝鱼,简单干烧就是一道大菜,过程超简单

    看着丑吃着香的多宝鱼,简单干烧就是一道大菜,过程超简单