我希望匹配以下模式:
foo!(1,2,3;4,5,6;7,8,9);
将为所有数字生成相同的代码,但我希望在出现分号时运行其他代码。这种模式可能吗?
我试过了:
macro_rule! {
foo ($($x:expr),*);*) => ...
但我似乎无法在右侧进行这项工作。
答案 0 :(得分:0)
您从未解释过现有代码的问题,因此我不知道在此示例中要强调的内容:
macro_rules! foo {
($($($x:expr),*);*) => {
$(
$(
print!("{},", $x);
)*
println!("semi");
)*
}
}
fn main() {
foo!(1,2,3;4,5,6;7,8,9);
}
我可以从原始代码中指出:
macro_rules!
,而不是macro_rule!
{
之前,而不是之后。The Rust Programming Language, first edition有几条有价值的信息。
macros chapter中介绍了定义宏的基本语法。我强烈建议你阅读整篇文章。它还链接到the reference,其中包含更低级别的细节。
与您的问题最相关的部分是:
Repetition
重复运算符遵循两个主要规则:
$(...)*
遍历一个"层"重复,对于它包含的所有$names
,锁步和- 每个
醇>$name
必须至少与匹配时的$(...)*
一致。如果它更多,它将被复制,视情况而定。