19|Rust的宏体系:为自己的项目写一个简单的声明宏
唐刚
你好,我是 Mike,今天我们一起来学习 Rust 语言中有关宏的知识。
宏是一套预处理设施。它的输入是代码本身,对代码进行变换然后输出新的代码。一般来说,输出的新代码必须是合法的当前语言的代码,用来喂给当前语言的编译器进行编译。
宏不是一门语言的必备选项,Java、Go 等语言就没有宏,而 C、CPP、Rust 等语言有宏,而且它们的宏工作方式不一样。
在 Rust 语言中,宏也属于语言的外围功能,用来增强 Rust 语言的核心功能,让 Rust 语言变得更方便好用。宏不属于 Rust 语言的核心,但这并不是说宏在 Rust 中不重要。其实在 Rust 代码中,宏随处可见,掌握宏的原理和用法,有助于我们编写更高效的 Rust 代码。
在 Rust 中,宏的解析和执行是在 Rust 代码的编译阶段之前。你可以理解成,在 Rust 代码编译之前有一个宏展开的过程,这个过程的输出结果就是完整版的 Rust 代码,然后 Rust 编译器再来编译这个输出的代码。
Rust 语言中的宏
当前版本的 Rust 中有两大类宏:声明宏(declarative macro)和过程宏(procedure macro),而过程宏又细分成三种:派生宏、属性宏和函数宏。
下面我们分别介绍一下它们。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
Rust语言中的宏是一种强大的预处理设施,本文介绍了声明宏、派生宏、属性宏和函数宏的概念及用法。声明宏通过`macro_rules!`定义,展示了如何编写一个简单的加法宏,并介绍了`macro_export`和`macro_use`的用法。派生宏通过示例展示了如何实现`Error`和`Debug`宏,以及如何展开宏的代码。属性宏的应用范围广泛,可以用于条件编译、设置crate属性、禁止代码提示等。函数宏则可以用于创建DSL,使得在Rust代码中编写非Rust语法的代码变得更加自然。总结了宏的应用,包括减少重复代码、为类型添加额外能力、创建DSL和实现任意自定义目标。文章强调了宏的重要性和使用注意事项,以及提供了思考题,鼓励读者深入学习相关属性的意义和用法。整体而言,本文详细介绍了Rust语言中宏的原理和用法,对于想要学习Rust语言宏的读者来说,是一篇很有参考价值的文章。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 语言从入门到实战》,新⼈⾸单¥59
《Rust 语言从入门到实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(5)
- 最新
- 精选
- Noyaallow、warn、deny、forbid: 编译器的警告级别
作者回复: 对的
2023-12-01归属地:浙江1 - 奕cargo expand 宏展开这个网站地址是什么啊
作者回复: play.rust-lang.org
2024-02-05归属地:广东 - Taozi过程宏本质上是编译器的扩展插件
作者回复: 对的👍
2023-12-02归属地:上海 - 伯阳感觉和注解有点像
作者回复: 属性宏和注解有点像
2023-12-01归属地:北京 - Distancemacro_rules! add { // 第一个分支,匹配两个元素的加法 ($a:expr, $b:expr)=>{ { $a+$b } }; // 第二个分支:当只有一个元素时,也应该处理,这是边界情况 ($a:expr)=>{ { $a } } } 为什么第二个分支匹配不需要分号呢? 我看第一个示例只有单个匹配也是分号结尾的
作者回复: 非常细心!👍。第二个分支后面也可以加分号的。分号的作用用来间隔多个分支。
2023-12-01归属地:北京2
收起评论