在使用宏定义特征时,我应该使用什么宏片段说明符来匹配方法声明?

时间:2018-04-12 15:04:40

标签: rust

我尝试使用宏来定义特征。

我找不到与方法声明匹配的片段说明符 我设法获得的最好成绩如下:

macro_rules! decorated_trait (
    ($tid:ident {
        $( fn $b:ident($($args:expr),*) );*
    }) => {
        trait $tid {
            fn default_function(&self, _x: i32, _y: &str) {
            }

            $( fn $b( $( $args ),* ); )*
        }
    };
);

decorated_trait!(MyTrait { 
    fn my_function(&self, x: i32);
    fn another(&self)
});

struct Foo {}

impl MyTrait for Foo {

    fn my_function(&self) {
        self.default_function(1, "bar");
    }

    fn another(&self) {}
}

fn main() {
    let _foo = Foo{};
}

错误是:

error: expected type, found `&self`
  --> src/main.rs:11:26
   |
11 |               $( fn $b( $( $args ),* ); )*
   |                            ^^^^^

1 个答案:

答案 0 :(得分:4)

虽然在技术上可以恰当地匹配特质方法的论点......但是不值得麻烦。只需将它们作为原始令牌匹配:

macro_rules! decorated_trait (
    ($tid:ident {
        $( fn $b:ident($($args:tt)*) );*
    }) => {
        trait $tid {
            fn default_function(&self, _x: i32, _y: &str) {
            }

            $( fn $b( $( $args )* ); )*
        }
    };
);

你的宏不起作用的原因是参数不是类型。它们是一个可选的" self - ish"可以采用多种不同形式的参数,其次是零个或多个pattern: type对,除非它们没有模式。

就像我说的那样,不值得麻烦。