Rust 语言从入门到实战
唐刚
Rust 语言中文社区联合创始人
5266 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 36 讲
Rust 语言从入门到实战
15
15
1.0x
00:00/00:00
登录|注册

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
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • Noya
    allow、warn、deny、forbid: 编译器的警告级别

    作者回复: 对的

    2023-12-01归属地:浙江
    1
  • cargo expand 宏展开这个网站地址是什么啊

    作者回复: play.rust-lang.org

    2024-02-05归属地:广东
  • Taozi
    过程宏本质上是编译器的扩展插件

    作者回复: 对的👍

    2023-12-02归属地:上海
  • 伯阳
    感觉和注解有点像

    作者回复: 属性宏和注解有点像

    2023-12-01归属地:北京
  • Distance
    macro_rules! add { // 第一个分支,匹配两个元素的加法 ($a:expr, $b:expr)=>{ { $a+$b } }; // 第二个分支:当只有一个元素时,也应该处理,这是边界情况 ($a:expr)=>{ { $a } } } 为什么第二个分支匹配不需要分号呢? 我看第一个示例只有单个匹配也是分号结尾的

    作者回复: 非常细心!👍。第二个分支后面也可以加分号的。分号的作用用来间隔多个分支。

    2023-12-01归属地:北京
    2
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部