从泛型类型的trait调用静态方法

pen*_*123 6 generics traits rust

我有一个特征,其中一个函数不self作为参数:

trait MyTrait {
    fn function(x: i32) -> i32;
}

struct Dummy;

impl MyTrait for Dummy {
    fn function(x: i32) -> i32 {
        x * 2
    }
}

fn call_method<T: MyTrait>(object: T) {
    let x = object.function(2);
}

fn main() {}
Run Code Online (Sandbox Code Playgroud)

库的用户需要为任何类型实现特征,通常是空结构.我的一个函数接受一个实现的泛型类型MyTrait.当我尝试function在泛型类型上调用该方法时,它给了我这个错误:

错误:没有为当前范围中的function类型命名的方法T

我在这个问题的答案中尝试了解决方案,但是我得到了同样的错误.如何在泛型类型上调用静态方法?

DK.*_*DK. 8

当我尝试function在泛型类型上调用方法时,...

两件事:首先,取决于你想看它的方式,function 不是一种方法.它只是一个恰好存在于特征命名空间(也称为 "关联函数")的函数.

其次,你不是试图调用function该类型,而是在该类型的值上调用它.这是不可能的,因为它不是一种方法; 它没有self参数.

解决方案是实际调用function泛型类型的关联函数,如下所示:

fn call_method<T: MyTrait>(object: T) {
    let x = T::function(2);
}
Run Code Online (Sandbox Code Playgroud)

有时,这不够具体.如果您需要更具体,您还可以将上述内容写成:

fn call_method<T: MyTrait>(object: T) {
    let x = <T as MyTrait>::function(2);
}
Run Code Online (Sandbox Code Playgroud)

两者在语义上是相同的 ; 只是当你涉及很多特征时,第二个更具体,更有可能解决.