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

时间:2015-12-17 07:46:38

标签: generics rust traits

我有一个特征,其中一个函数不会将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方法时,它会给我这个错误:

  

错误:在当前范围

中找不到类型function的名为T的方法

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

2 个答案:

答案 0 :(得分:7)

  

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

两件事:首先,根据您的查看方式,function 不是方法。它只是一个恰好存在于特质命名空间中的函数( a.k.a。&#34;相关函数&#34;)。

其次,您尝试在该类型上调用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);
}

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

答案 1 :(得分:0)

下面是DK。答案,您实际上不需要将“ object:T”作为参数传递给函数。

你可以做

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

实际上,如果我做对了,您就不会将此结构传递给函数,而只是通过T链接它,因此不涉及移动/借位语义。 但是我在这里可能错了