You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust声明式宏重复展开中元变量的工作原理问询

Rust声明式宏重复展开中元变量的工作原理问询

嘿,我来给你掰扯清楚这个Rust声明式宏里重复展开的元变量是怎么回事哈!

你提到的演示宏代码是这样的:

macro_rules! repeat_two {
    ($($i:ident)*, $($i2:ident)*) => {
        $( let $i: (); let $i2: (); )*
    }
}

repeat_two!( a b c d e f, u v w x y z );

在Rust Playground里它会被展开成:

let a: (); let u: (); let b: (); let v: (); let c: (); let w: (); let d: (); let x: (); let e: (); let y: (); let f: (); let z: ();

这里的核心逻辑其实很直观,我给你拆解下:

  • 首先看宏的模式部分$($i:ident)*, $($i2:ident)*:这里的$($i:ident)*是一个重复捕获,会把逗号前的所有标识符(也就是a b c d e f)一个个存到元变量$i的“队列”里;逗号后的$($i2:ident)*同理,把u v w x y z存到$i2的队列里。
  • 然后是展开模板$( let $i: (); let $i2: (); )*:末尾的*表示要按照前面捕获到的重复次数来循环展开。这里两个队列的长度都是6,所以会循环6次——每次循环从$i和$i2的队列里各取一个元素,拼成一对let 变量: ();的语句,直到两个队列的元素都用完。

要注意的是,这种多重复捕获的展开要求所有捕获的重复次数必须一致,要是你传入的两批标识符数量不一样,宏会直接报错,因为它没法给剩下的单个元素找到对应的搭档哦~

备注:内容来源于stack exchange,提问作者kesarling

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:08:10