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

Fre*_*ios 6 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() {}
Run Code Online (Sandbox Code Playgroud)

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

Mas*_*ara 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();
}
Run Code Online (Sandbox Code Playgroud)

  • 它是一个任意的虚拟标记,用于强制内部重复重复 0 次。我选择“@”只是因为它不太可能被使用。 (3认同)