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! match_exprs {
    ($($exprs:expr),* $(,)*) => {...};
}Run

Rust语法在很多地方允许尾部分隔符存在。一列(举例说)表达式的常见匹配方式有两种($($exprs:expr),*$($exprs:expr,)*);一种可处理无尾部分隔符的情况,一种可处理有的情况;但没办法同时匹配到。

不过,在主重复的尾部放置一个$(,)*重复,则可以匹配到任意数量(包括0或1)的尾部分隔符。

注意此模式并非对所有情况都适用。如果被编译器拒绝,可以尝试增加匹配臂和/或使用逐条匹配。