初面网初面网

宏(Macro)是一种在代码中进行元编程(Metaprogramming)的技术,它允许在编译时生成代码,宏可以帮助简化代码,提高代码的可读性和可维护性,同时允许开发者在编译时执行一些代码生成的操作。

Rust中的宏,是一种在编译时生成代码的强大工具,允许你在编写代码时创建自定义语法扩展。

宏在 Rust 中有两种类型:声明式宏(Declarative Macros)和过程宏(Procedural Macros)。

下面主要介绍声明式宏(Declarative Macros)的使用方法。

声明式宏(Declarative Macros)

macro_rules! 关键字进行定义。这种宏的定义是基于模式匹配的,可以匹配代码的结构并根据匹配的模式生成相应的代码。在不引入新的语法结构的情况下,可以用来简化一些通用的代码模式。

结构示例:

macro_rules! my_macro {
  // 模式匹配和展开
  ($arg:expr) => {
    // 生成的代码
    // 使用 $arg 代替匹配到的表达式
  };
}

实际示例:

// 宏的定义
macro_rules! greet {
  // 模式匹配
  ($name:expr) => {
    // 宏的展开
    println!("Hello, {}!", $name);
  };
}

fn main() {
  // 调用宏
  greet!("World");
}

复杂实例:

// 宏的定义
macro_rules! vec {
  // 基本情况,空的情况
  () => {
    Vec::new()
  };
  
  // 递归情况,带有元素的情况
  ($($element:expr),+ $(,)?) => {
    {
      let mut temp_vec = Vec::new();
      $(
        temp_vec.push($element);
      )+
      temp_vec
    }
  };
}

fn main() {
  // 调用宏
  let my_vec = vec![1, 2, 3];
  println!("{:?}", my_vec); // 输出: [1, 2, 3]

  let empty_vec = vec![];
  println!("{:?}", empty_vec); // 输出: []
}

过程宏(Proc Macros)

过程宏是一种更为复杂的宏类型,它可以在编译时对代码进行操作和转换。过程宏的定义需要使用 proc_macro 模块提供的宏定义语法。

从类型上说,分成派生宏(Derive Macros)和属性宏(Attribute Macros)两种类型。

过程宏的实现通常需要使用 proc_macro 库提供的功能,例如 TokenStream 和 TokenTree,以便更直接地操纵源代码。

更新于 2026/5/26