03-Rust宏的应用场景
9.2 Rust宏的应用场景
使用宏的一个好处是它们不像函数那样急切地解析其参数,这是使用除函数之外的宏的动机之一。
注意
及早求值的意思是调用类似foo(bar(2))这样的函数,将首先计算出bar(2)的结果,然后将其传递给foo。与此相反的是惰性求值,你将在迭代器中看到它。
一般的经验法则是,宏可以在函数无法提供所需解决方案的情况下使用,其中的代码具有相当的重复性,或者在需要检查类型结构体并在编译期生成代码的情况下使用宏。以实际应用场景为例,在很多情况下都会用到Rust宏,如下。
- 通过创建自定义领域特定语言(Domain-Specific Language,DSL)来扩展语言语法。
- 编写编译期序列化代码,就像serde那样。
- 将计算操作移动到编译期,从而减少运行时开销。
- 编写样板测试代码和自动化测试用例。
- 提供零成本日志记录抽象,例如log软件包。
同时应该谨慎地使用宏,它们会使代码难以维护和理解。这是因为它们是在元级别工作,所以没有多少开发人员会习惯使用它们。它们使代码更难理解,从可维护性的角度来看,可读性的优先级始终应该排在前面。此外,大量使用宏会导致性能损失,因为会产生大量重复的代码,这会影响CPU指令缓存。