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
相关产品推荐
相关产品推荐

