Rust 宏中相同变量的不同分隔符
Different separators for the same variable in Rust Macros
我想匹配这样的模式:
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!
- 正在定义的宏的名称在原始
{
之前,而不是在之后。
- 与大多数编程一样,成对的定界符需要均匀匹配才能在语法上有效。
The Rust Programming Language, first edition 有几条有价值的信息。
定义宏的基本语法包含在 macros chapter; I strongly suggest you read the entire thing. It also links to the reference 中,其中包含一些更底层的细节。
与您的问题最相关的部分是:
Repetition
The repetition operator follows two principal rules:
$(...)*
walks through one "layer" of repetitions, for all of the $names
it contains, in lockstep, and
- each
$name
must be under at least as many $(...)*
s as it was matched against. If it is under more, it’ll be duplicated, as appropriate.
我想匹配这样的模式:
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!
- 正在定义的宏的名称在原始
{
之前,而不是在之后。 - 与大多数编程一样,成对的定界符需要均匀匹配才能在语法上有效。
The Rust Programming Language, first edition 有几条有价值的信息。
定义宏的基本语法包含在 macros chapter; I strongly suggest you read the entire thing. It also links to the reference 中,其中包含一些更底层的细节。
与您的问题最相关的部分是:
Repetition
The repetition operator follows two principal rules:
$(...)*
walks through one "layer" of repetitions, for all of the$names
it contains, in lockstep, and- each
$name
must be under at least as many$(...)*
s as it was matched against. If it is under more, it’ll be duplicated, as appropriate.