Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 在使用宏定义特征时,我应该使用什么宏片段说明符来匹配方法声明?_Rust - Fatal编程技术网

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
参数是特殊的,不是您可以直接匹配的任何特定参数。其他参数是模式和类型的组合。所以不,它们不是表情。