我想匹配如下模式:
foo!(1,2,3;4,5,6;7,8,9);
将为所有数字生成相同的代码,但我希望在有分号时运行其他代码。这种模式可能吗?
我试过了:
macro_rule! {
foo ($($x:expr),*);*) => ...
但我似乎无法在右侧完成这项工作。
我想匹配如下模式:
foo!(1,2,3;4,5,6;7,8,9);
将为所有数字生成相同的代码,但我希望在有分号时运行其他代码。这种模式可能吗?
我试过了:
macro_rule! {
foo ($($x:expr),*);*) => ...
但我似乎无法在右侧完成这项工作。
您从未解释过现有代码的问题所在,因此我不知道在此示例中要突出显示什么:
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!
{
,而不是之后。Rust 编程语言,第一版有几条有价值的信息。
定义宏的基本语法在宏一章中介绍;我强烈建议您阅读全文。它还链接到参考,其中包含一些更底层的细节。
与您的问题最相关的部分是:
重复
重复运算符遵循两个主要规则:
$(...)*
遍历一个“层”的重复,对于$names
它包含的所有内容,步调一致,并且- 每个
$name
必须至少低于$(...)*
匹配的 s 数。如果它低于更多,它将被复制,视情况而定。