我想要一个 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]);
}
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