Rust Macros中相同变量的不同分隔符

时间:2018-01-30 02:23:59

标签: rust rust-macros

我希望匹配以下模式:

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

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

我试过了:

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

但我似乎无法在右侧进行这项工作。

1 个答案:

答案 0 :(得分: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. 与大多数编程一样,配对分隔符需要均匀匹配才能在语法上有效。
  4. The Rust Programming Language, first edition有几条有价值的信息。

    macros chapter中介绍了定义宏的基本语法。我强烈建议你阅读整篇文章。它还链接到the reference,其中包含更低级别的细节。

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

      

    Repetition

         

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

         
        
    1. $(...)*遍历一个"层"重复,对于它包含的所有$names,锁步和
    2.   
    3. 每个$name必须至少与匹配时的$(...)*一致。如果它更多,它将被复制,视情况而定。
    4.