Rust 在使用宏定义特征时,我应该使用什么宏片段说明符来匹配方法声明?
我试图用宏定义一个特征 我没有找到与方法声明和 我得到的最好结果如下:Rust 在使用宏定义特征时,我应该使用什么宏片段说明符来匹配方法声明?,rust,Rust,我试图用宏定义一个特征 我没有找到与方法声明和 我得到的最好结果如下: macro_rules! decorated_trait ( ($tid:ident { $( fn $b:ident($($args:expr),*) );* }) => { trait $tid { fn default_function(&self, _x: i32, _y: &str) { }
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{};
}
错误是:
错误:应为类型,找到“%self”`
-->src/main.rs:11:26
|
11 |$(fn$b($($args),*);)*
| ^^^^^
虽然技术上可以正确匹配trait方法的参数。。。不值得这么麻烦。只需将它们作为原始标记进行匹配:
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
对,除非它们没有模式
就像我说的,不值得这么麻烦。虽然从技术上讲,可以正确匹配trait方法的参数。。。不值得这么麻烦。只需将它们作为原始标记进行匹配:
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
对,除非它们没有模式
就像我说的,不值得这么麻烦。非常感谢@DK。只是想确定一下。。。我将您的解释理解为:
expr
计算为一个值并具有一个类型,但是&self
和函数参数不是表达式。是吗?self
参数是特殊的,不是您可以直接匹配的任何特定参数。其他参数是模式和类型的组合。所以不,它们不是表达。非常感谢@DK。只是想确定一下。。。我将您的解释理解为:expr
计算为一个值并具有一个类型,但是&self
和函数参数不是表达式。是吗?self
参数是特殊的,不是您可以直接匹配的任何特定参数。其他参数是模式和类型的组合。所以不,它们不是表情。