Rust 宏对两个列表的每个组合都会重复?

问题描述 投票:0回答:1

我想要一个 Rust 宏,给定两个列表,重复这两个列表中项目的每个组合。例如:

callback!(['a', 'b', 'c'], [1, 2, 3]);

会生成:

callback('a', 1);
callback('a', 2);
callback('a', 3);
callback('b', 1);
callback('b', 2);
callback('b', 3);
callback('c', 1);
callback('c', 2);
callback('c', 3);

以下宏应该可以工作,但在第二种情况下会失败。我的重复$($zs,)*

好像有问题。有什么问题吗?

macro_rules! m { (@a [$x:expr, $($xs:expr,)*] [$y:expr, $($ys:expr,)*] [$($zs:expr,)*]) => { println!("{} {}", $x, $y); m!(@a [$x, $($xs,)*] [$($ys,)*] [$($zs,)*]); }; (@a [$x:expr, $($xs:expr,)*] [] [$($zs:expr,)*]) => { m!(@a [$($xs,)*] [$($zs,)*] [$($zs,)*]); // fails here }; (@a [] [] [$($zs:expr,)*]) => { //done }; ([$($xs:expr),*], [$($ys:expr),*]) => { m!(@a [$($xs,)*] [$($ys,)*] [$($ys,)*]); }; } fn main() { m!(['a', 'b', 'c'], [1, 2, 3]); }
    
rust macros
1个回答
0
投票
你太复杂了,只需使用令牌树作为第二个参数,然后你可以为第一个列表中的每个元素简单地复制它,然后每秒重复一次:

macro_rules! m { ([$($x:expr),*], $ys:tt) => { $(m!(@a $x ; $ys);)* }; (@a $x:expr ; [$($y:expr),*]) => { $(println!("{}, {}", $x, $y);)* }; }
打印:

a, 1 a, 2 a, 3 b, 1 b, 2 b, 3 c, 1 c, 2 c, 3
    
© www.soinside.com 2019 - 2024. All rights reserved.