在泛型类型上调用trait中的静态方法

12

我有一个带有一个函数的特质,该函数不需要将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

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

14
当我尝试在通用类型上调用function方法时,有两件事情需要注意:首先,根据你的看法,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);
}

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


3

继DK的回答之后,您实际上不需要将“object:T”作为参数传递给您的函数。

您只需执行

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

事实上,如果我理解正确的话,你并没有将这个结构体传递给函数,而只是通过 T 进行了链接,因此不存在移动/借用语义。但是我也可能理解有误。

1
main 函数中,可以通过 call_method::<Dummy>() 调用 call_method 函数。 - Meet Sinojia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接