Rust 程序设计(第 2 版)
Jim Blandy, Jason Orendorff, Leonora F. S. Tindall
软件工程师
1469 人已学习
立即订阅
登录后,你可以任选4讲全文学习
推荐试读
换一换
课程目录
已完结/共 41 讲
时长 02:41
时长 06:30
时长 10:04
时长 01:05
时长 50:06
时长 31:35
时长 34:39
时长 29:11
时长 37:15
时长 23:44
时长 44:19
时长 29:54
时长 39:01
时长 01:38
时长 01:15
时长 00:37
Rust 程序设计(第 2 版)
15
15
1.0x
00:00/00:00
登录|注册

第 21 章 宏

cento(来自拉丁语,意为“拼凑而成”)是一种完全由引自其他诗人的诗句组成的诗。
——Matt Madden
Rust 支持。宏是一种扩展语言的方式,它能做到单纯用函数无法做到的一些事。例如,我们已经见过 assert_eq! 宏,它是用于测试的好工具:
assert_eq!(gcd(6, 10), 2);
这也可以写成泛型函数,但是 assert_eq! 宏能做到一些无法用函数做到的事。一是当断言失败时,assert_eq! 会生成一条错误消息,其中包含断言的文件名和行号。函数无法获取这些信息,而宏可以,因为它们的工作方式完全不同。
宏是一种简写形式。在编译期间,在检查类型并生成任何机器码之前,每个宏调用都会被展开。也就是说,每个宏调用都会被替换成一些 Rust 代码。前面的宏调用展开后大致如下所示:
match (&gcd(6, 10), &2) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
panic!("assertion failed: `(left == right)`, \
(left: `{:?}`, right: `{:?}`)", left_val, right_val);
}
}
}
panic! 也是一个宏,它本身可以展开为更多的 Rust 代码(此处未展示)。这些代码使用了另外两个宏,即 file!()line!()。一旦 crate 中的每个宏调用都已完全展开,Rust 就会进入下一个编译阶段。
在运行期,断言失败时是这样的(同时指出了 gcd() 函数中存在 bug,因为 2 才是正确答案):
thread 'main' panicked at 'assertion failed: `(left == right)`, (left: `17`,
right: `2`)', gcd.rs:7
如果你是 C++ 用户,那么可能对宏有过一些不好的体验。Rust 宏采用了完全不同的设计,类似于 Scheme 的 syntax-rules。与 C++ 宏相比,Rust 宏能与语言的其余部分更好地集成,因此更不容易出错。宏调用总是标有感叹号,因此在你阅读代码时很容易发现它们,并且当你想要调用函数时也不会意外调用它们。Rust 宏永远不会插入不匹配的方括号或圆括号,它们天生支持模式匹配,因此编写既可维护又易于使用的宏非常容易。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Rust宏是一种强大的扩展语言方式,与C++宏不同,Rust宏采用了类似于Scheme的设计,更容易集成并避免出错。宏模式是一种迷你语言,用于匹配代码的正则表达式,而宏模板则用于填充匹配到的代码片段。文章还提到了宏的高级技术,以及称为过程宏的更强大的机制。通过深入理解宏,读者可以获得更多的回报,并且文章还提供了进一步学习的指导,以便读者深入了解宏的高级技术和过程宏的更强大机制。文章还介绍了Rust宏与其他语言的差异,以及宏在实际编程中的应用。总的来说,本文全面介绍了Rust宏的基础知识和高级技术,对于想要深入了解Rust宏的读者来说是一份很好的参考资料。文章还提到了Rust宏的卫生机制,以及如何在匹配过程中避免语法错误。同时,还介绍了宏的导入和导出,以及如何在宏中使用绝对路径和$crate关键字。文章还介绍了过程宏的独立机制,以及如何利用它们实现自定义属性和处理自定义派生。此外,文章还提到了构建脚本生成Rust代码的方法,为读者提供了多种选择来处理复杂的功能需求。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 程序设计(第 2 版)》
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部