You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用宏定义Rust Trait时,匹配方法声明应选哪种宏片段指定符?

Rust宏定义Trait:正确匹配方法声明的片段指定符

找对片段指定符就解决问题啦!你之前用$args:expr是用来匹配表达式的,但方法声明里的参数是「模式+类型」的结构(比如&selfx: i32),这时候得用pat_type这个专门的片段指定符才行——它就是为匹配这种参数语法设计的。

修改后的宏代码如下:

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

// 用宏定义你的Trait
decorated_trait!(MyTrait {
    fn my_function(&self, x: i32);
    fn another(&self);
});

// 实现Trait的示例代码
struct Foo {}
impl MyTrait for Foo {
    fn my_function(&self, x: i32) {
        println!("Received value: {}", x);
    }
    fn another(&self) {
        println!("Another method executed!");
    }
}

为什么pat_type是正确选择?

  • 它完美覆盖了所有合法的Rust方法参数:不管是&self/&mut self这种隐式self参数,还是带类型标注的普通参数(比如x: i32),甚至更复杂的模式参数(比如(a, b): (i32, String))都能正确捕获。
  • 替换后宏就能正确解析你的方法声明,不会再出现匹配失败的问题。

内容的提问来源于stack exchange,提问作者attdona

火山引擎 最新活动