当前位置: 首页 > 知识库问答 >
问题:

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

姜鹏程
2023-03-14

我试图用宏定义一个特征。

我还没有找到与方法声明相匹配的片段说明符,我最好能得到以下内容:

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个答案

曾航
2023-03-14

虽然在技术上可以正确匹配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对,除非它们没有模式。

就像我说的,不值得这么麻烦。

 类似资料:
  • Rust 提供了一个强大的宏系统,可进行元编程(metaprogramming)。正如你已经看过了前面章节,宏看起来和函数很像,除了名称末尾连着一个感叹号 ! ,但宏并不产生一个函数调用,而是展开成源码并结合程序的其余代码一起进行编译。 宏是通过 macro_rules! 宏来创建的。 // 这是一个简单简单的宏,名为 `say_hello`。 macro_rules! say_hello {

  • 我发现自己写的代码是这样的: 很多次了。我试图创建一个宏来为我输出此函数: 但无论我为元变量选择什么片段说明符(,,,,它们的组合),它都会出错。有什么魔法咒语能让它起作用? 类型和如下所示: 铁锈操场上的一个(错误)例子。 当然这里有一个XY问题:我使用的是diesel板条箱,它的结构上有派生impl,我希望能够

  • 目标 在这一章中,我们将混合特征匹配和来自 calib3d 的单应性匹配来从一个复杂的图像中寻找已知的物体。 基础 我们在上节课做了什么?我们使用了一个 queryImage,在其中找到了一些特征点,我们又拿了一个 trainImage,在那个图像中也找到了这些特征,并且找到了它们之间最好的匹配。 总之,我们在另一个混乱的图像中发现了一个物体某些部分的位置。这些信息足以在 trainImage 上

  • 宏里面的参数使用一个美元符号 $ 作为前缀,并使用一个指示符(designator)来注明类型: macro_rules! create_function { // 此宏接受一个 `ident` 指示符参数,并创建一个名为 `$func_name` // 的函数。 // `ident` 指示符用于变量名或函数名 ($func_name:ident) => (

  • 通读ANSI C Yacc语法规范后,我注意到以下内容都是有效的: 这对我来说似乎很奇怪,因为我对类型的理解表明这些变量都没有类型。这些是什么意思?如何检查它们的类型?分配了多少内存?

  • 问题内容: 因此,我认为我对Java中的异常处理有很好的基本了解,但是最近我正在阅读一些使我有些困惑和怀疑的代码。我要在这里解决的主要疑问是,何时一个人使用时会抛出如下所示的Java方法声明: 通过阅读一些类似的文章,我收集到的 引发信息 被用作一种声明, 表明 可以在方法执行期间引发 SomeException 。 我的困惑来自一些看起来像这样的代码: 在此示例中,您是否有任何理由要使用 抛出