rust中的宏分为两类:

  • 声明宏
  • 过程宏

    • 派生宏 #[derive]
    • 类属性宏
    • 类函数宏

      宏和函数的区别

      函数是某些数理逻辑的抽象,是具体的代码。
      宏是编写代码的工具。也叫元编程。宏具有更高的抽象。

      声明宏

      #[macro_export]

      当宏所在的包被使用时,自动将宏导入。

      #[macro_use]

      从模块中导出宏。将宏的可见性扩大。
      1. #[macro_export]
      2. macro_rules! vec_new {
      3. ($($x:expr), *) => {
      4. {
      5. let mut tmp_vec = Vec::new();
      6. $(
      7. tmp_vec.push($x);
      8. )*
      9. tmp_vec
      10. }
      11. };
      12. }
      第一行已说明。
      第二行中macro_rules! vec_new{}是宏声明的基本格式。vec_new代表的是宏名称。注意使用的时候要在名称后面接!。
      第三行后面的内容是模式。宏中可以有多个模式。这里只有一个。
      模式中以=>作为分界线。前面的是匹配结构,后面的是代码块。

      匹配结构

      特殊:空匹配。
      标准的匹配结构:
      1. $标识符:种类
      可选的种类:
  • item 函数,结构体,模块。

  • block 块,由大括号括起来的内容。
  • stmt a statement.
  • pat 模式。
  • ty 类型。
  • ident 标识符。
  • path 路径
  • meta ??
  • tt 词法树。

    结构的可重复性:

    通过使用$()将结构包裹,在添上sep 分割符,rep 次数限定。
    sep: , ;
    rep : * + ?

    过程宏

    过程宏接受某些代码作为输入,对该代码进行操作,并生成一些代码作为输出。

创建过程宏时,定义必须驻留在具有特殊板条箱类型的板条箱中。

宏的编写准则

  • 将宏规则从最具体到最不具体编写
  • 注意宏使用的上下文。