我尝试使用宏来定义特征。
我找不到与方法声明匹配的片段说明符 我设法获得的最好成绩如下:
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 ),* ); )*
| ^^^^^
答案 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
对,除非它们没有模式。
就像我说的那样,不值得麻烦。