我想匹配一个模式,如:
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!
macro_rules!
macro_rule!
正在定义的宏的名称位于原始 { 之前,而不是之后 .
{
与大多数编程一样,配对分隔符需要均匀匹配才能在语法上有效 .
The Rust Programming Language, first edition有几条有 Value 的信息 .
macros chapter中介绍了定义宏的基本语法 . 我强烈建议你阅读整篇文章 . 它还链接到the reference,其中包含更多低级细节 .
与您的问题最相关的部分是:
重复重复运算符遵循两个主要规则:$(...)遍历一个重复的“层”,对于它包含的所有$ name,锁步,每个$ name必须至少为$ $ (...) s匹配时 . 如果它更多,它将被复制,视情况而定 .
1 回答
你从来没有解释现有代码的问题,所以我不知道在这个例子中要强调什么:
我可以从原始代码中指出:
它被称为
macro_rules!
,而不是macro_rule!
正在定义的宏的名称位于原始
{
之前,而不是之后 .与大多数编程一样,配对分隔符需要均匀匹配才能在语法上有效 .
The Rust Programming Language, first edition有几条有 Value 的信息 .
macros chapter中介绍了定义宏的基本语法 . 我强烈建议你阅读整篇文章 . 它还链接到the reference,其中包含更多低级细节 .
与您的问题最相关的部分是: