如何在宏中命名任意序列的事物?

时间:2018-03-05 17:31:51

标签: macros rust

我正在尝试在宏中使用?,匹配任意关键字:

#![feature(macro_at_most_once_rep)]

macro_rules! foo {
    (
        pub fn $name:ident (
            & $m : $( mut )? self
        )
    ) => (
        pub fn $name (
            & $m self
        ) {}
    )
}

struct Foo;

impl Foo {
    foo!( pub fn bar(&mut self) );
    foo!( pub fn baz(&self) );
}

fn main() {}

我尝试了不同的语法,但都失败了。怎么做?

1 个答案:

答案 0 :(得分:1)

一个技巧是插入带有虚拟标记的重复。

#![feature(macro_at_most_once_rep)]

macro_rules! foo {
    (
        pub fn $name:ident (
            & $( $(@$m:tt)* mut )? self
        )
    ) => (
        pub fn $name (
            & $( $(@$m)* mut )? self
        ) {}
    )
}

struct Foo;

impl Foo {
    foo!( pub fn bar(&mut self) );
    foo!( pub fn baz(&self) );
}

fn main() {
    (&mut Foo).bar();
    (&mut Foo).baz();
    // (&Foo).bar(); //~ERROR cannot borrow
    (&Foo).baz();
}