从泛型类型的特征调用静态方法

Call static method from trait on generic type

我有一个不以 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() {}

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

error: no method named function found for type T in the current scope

我尝试了 this question 的答案中的解决方案,但我得到了同样的错误。如何在泛型类型上调用静态方法?

When I try to call the function method on the generic type, ...

两件事:首先,取决于您如何看待它,function 不是 一种方法。它只是一个恰好存在于特征命名空间中的函数 (a.k.a. 和 "associated function").

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

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

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

有时,这不够具体。如果需要更具体一点,可以把上面写成:

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

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

关注 DK。回答,你实际上不需要将 "object: T" 作为参数传递给你的函数。

你可以做到

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

事实上,如果我没弄错的话,您并不是将此结构传递给函数,而只是通过 T 链接它,因此不涉及 move/borrow 语义。 但我这里可能是错的