macro_rules!
Rust 提供了一个强大的宏系统,允许进行元编程。正如你在之前的章节中看到的,宏看起来像函数,只是它们的名称以感叹号 ! 结尾,但宏不是生成函数调用,而是被扩展成源代码,这些源代码会与程序的其余部分一起被编译。然而,与 C 和其他语言中的宏不同,Rust 宏会被扩展成抽象语法树(abstract syntax trees),而不是字符串预处理,因此你不会遇到意外的优先级错误。
宏是使用 macro_rules! 宏创建的。
// This is a simple macro named `say_hello`. macro_rules! say_hello { // `()` indicates that the macro takes no argument. () => { // The macro will expand into the contents of this block. println!("Hello!") }; } fn main() { // This call will expand into `println!("Hello!")` say_hello!() }
那么为什么宏很有用呢?
-
不要重复你自己。有很多情况你可能需要在多个地方使用类似的功能,但处理的是不同的类型。通常,编写宏是一种避免重复代码的有效方法。(稍后会有更多介绍)
-
领域特定语言。宏允许你为特定目的定义特殊语法。(稍后会有更多介绍)
-
可变参数接口。有时你可能想定义一个接受可变数量参数的接口。一个例子是
println!,它可以接受任意数量的参数,具体取决于格式字符串。(稍后会有更多介绍)