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

问题描述 投票:6回答:2

我具有一个特征,该特征具有一个不以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的答案中的解决方案,但遇到相同的错误。如何在泛型类型上调用静态方法?

generics rust traits
2个回答
9
投票

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

两件事:首先,根据您要如何看待它,function 不是一种方法。它只是恰好存在于特征的名称空间中的一个函数(a.k.a。一个“关联函数”)。

第二,您正在[[not尝试在该类型上调用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); }
这两个在语义上是[[identical
;只是当您涉及很多特质时,第二个更具体,更可能解决。

0
投票
您可以做

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

实际上,如果我做对了,您没有将这个结构传递给函数,而只是通过T链接了它,因此不涉及移动/借位语义。

但是我可能在这里错了。
© www.soinside.com 2019 - 2024. All rights reserved.