-1

我想匹配如下模式:

foo!(1,2,3;4,5,6;7,8,9); 

将为所有数字生成相同的代码,但我希望在有分号时运行其他代码。这种模式可能吗?

我试过了:

macro_rule! {
    foo ($($x:expr),*);*) => ...

但我似乎无法在右侧完成这项工作。

4

1 回答 1

0

您从未解释过现有代码的问题所在,因此我不知道在此示例中要突出显示什么:

macro_rules! foo {
    ($($($x:expr),*);*) => {
        $(
            $(
                print!("{},", $x);
            )*
            println!("semi");
        )*
    }
}

fn main() {
    foo!(1,2,3;4,5,6;7,8,9); 
}

我可以从您的原始代码中指出一些事情:

  1. macro_rules!,不是macro_rule!
  2. 正在定义的宏的名称在原来的 之前{,而不是之后。
  3. 像大多数编程一样,成对的分隔符需要均匀匹配才能在语法上有效。

Rust 编程语言,第一版有几条有价值的信息。

定义宏的基本语法在宏一章中介绍;我强烈建议您阅读全文。它还链接到参考,其中包含一些更底层的细节。

与您的问题最相关的部分是:

重复

重复运算符遵循两个主要规则:

  1. $(...)*遍历一个“层”的重复,对于$names它包含的所有内容,步调一致,并且
  2. 每个$name必须至少低于$(...)*匹配的 s 数。如果它低于更多,它将被复制,视情况而定。
于 2018-01-30T16:45:44.437 回答