1. 1. Introduction
  2. 2. 宏,彻底剖析
    1. 2.1. 语法扩展
      1. 2.1.1. 源码解析过程
      2. 2.1.2. AST中的宏
      3. 2.1.3. 展开
    2. 2.2. macro_rules!
    3. 2.3. 细枝末节
      1. 2.3.1. 再探捕获与展开
      2. 2.3.2. 卫生性
      3. 2.3.3. 不是标识符的标识符
      4. 2.3.4. 调试
      5. 2.3.5. 作用域
      6. 2.3.6. 导入/导出
  3. 3. 宏,实践介绍
  4. 4. 常用模式
    1. 4.1. 回调
    2. 4.2. 标记树撕咬机
    3. 4.3. 内用规则
    4. 4.4. 下推累积
    5. 4.5. 重复替代
    6. 4.6. 尾部分隔符
    7. 4.7. 标记树聚束
    8. 4.8. 可见性
    9. 4.9. 临时措施
  5. 5. 轮子
    1. 5.1. AST强转
    2. 5.2. 计数
    3. 5.3. 枚举解析
  6. 6. 实例注解
    1. 6.1. Ook!

重复替代

macro_rules! replace_expr {
    ($_t:tt $sub:expr) => {$sub};
}Run

在此模式中,匹配到的重复序列将被直接丢弃,仅留用它所带来的长度信息;原本标记所在的位置将被替换成某种重复要素。

举个例子,考虑如何为一个元素多于12个(Rust 1.2下的最大值)的tuple提供默认值。

macro_rules! tuple_default {
    ($($tup_tys:ty),*) => {
        (
            $(
                replace_expr!(
                    ($tup_tys)
                    Default::default()
                ),
            )*
        )
    };
}Run

仅对此例:我们其实可以直接用$tup_tys::default()

上例中,我们并未真正使用匹配到的类型。实际上,我们把它抛开了,并用用一个表达式重复替代。换句话说,我们实际关心的不是有哪些类型,而是有多少个类型。