macro_rules!

Rust 提供了一个强大的宏系统,允许进行元编程。正如您在前几章中所见,宏看起来像函数,除了它们的名称以感叹号 ! 结尾,但宏不是生成函数调用,而是扩展为源代码,这些源代码与程序的其余部分一起编译。但是,与 C 和其他语言中的宏不同,Rust 宏被扩展为抽象语法树,而不是字符串预处理,因此您不会遇到意外的优先级错误。

宏是使用 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!()
}

那么,为什么宏很有用?

  1. 不要重复自己。在很多情况下,您可能需要在多个地方使用相似的功能,但类型不同。通常,编写宏是避免重复代码的有效方法。(稍后将详细介绍)

  2. 领域特定语言。宏允许您为特定目的定义特殊语法。(稍后将详细介绍)

  3. 可变参数接口。有时您想定义一个接受可变数量参数的接口。例如 println!,它可以根据格式字符串接受任意数量的参数。(稍后将详细介绍)