加餐|宏编程(下):用 syn/quote 优雅地构建宏
陈天
该思维导图由 AI 生成,仅供参考
你好,我是陈天。
上堂课我们用最原始的方式构建了一个 RawBuilder 派生宏,本质就是从 TokenStream 中抽取需要的数据,然后生成包含目标代码的字符串,最后再把字符串转换成 TokenStream。
今天我们就尝试用这个 syn / quote 工具,来构建一个同样的 Builder 派生宏,你可以对比一下两次的具体的实现,感受 syn / quote 构建过程宏的方便之处。
syn crate 简介
先看 syn。syn 是一个对 TokenStream 解析的库,它提供了丰富的数据结构,对语法树中遇到的各种 Rust 语法都有支持。
比如一个 Struct 结构,在 TokenStream 中,看到的就是一系列 TokenTree,而通过 syn 解析后,struct 的各种属性以及它的各个字段,都有明确的类型。这样,我们可以很方便地通过模式匹配来选择合适的类型进行对应的处理。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
Rust宏编程的强大工具:syn和quote库 Rust宏编程中,处理TokenStream的解析和代码生成变得更加便捷和优雅,得益于syn和quote库提供的强大工具。syn库通过解析TokenStream,提供了丰富的数据结构,对语法树中的Rust语法有良好支持,特别是对derive macro提供了特殊支持。quote库则提供了quote!宏,能够将代码转换成可操作的数据,保留了代码的所有语义。通过这两个库,可以更轻松地构建宏,提高代码的可读性和可维护性。 在使用syn/quote重写Builder派生宏时,首先通过parse_macro_input!宏将TokenStream解析为DeriveInput结构的数据,然后定义了BuilderContext结构用于处理derive宏的信息。通过From<T> trait的实现,将Field转换为Fd,DeriveInput转换为BuilderContext。这样的实现体现了Rust的优雅和简洁,尤其是在处理Option<T>类型时,使用了一个尚不存在的函数get_option_inner(),以实现对不同类型的处理。 文章还介绍了对attributes的支持,以及如何使用darling库进一步提供对attributes的支持。同时,文章也提醒读者在使用宏时要谨慎,不要过度依赖宏,要将宏编程作为撰写代码最后的手段。 总之,syn和quote库为Rust宏编程提供了强大的工具,使得处理TokenStream的解析和代码生成变得更加便捷和优雅。文章中提供了详细的代码示例和解释,帮助读者更好地理解和应用这些工具。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《陈天 · Rust 编程第一课》,新⼈⾸单¥68
《陈天 · Rust 编程第一课》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(3)
- 最新
- 精选
- HiNeNi感谢老师加餐!顶顶顶!2022-01-261
- 🐳大海全是水可以把宏生成的代码写到代码文件里吗?如果每次都是编译生成,看不见摸不着不好调试,每次生成也比较耗时。2023-02-27归属地:广东
- 小可爱(`へ´*)ノ宏用起来还是挺方便的,就是写起来有点复杂。2023-01-29归属地:上海
收起评论