我有一个特征,其中一个函数不会将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的答案中尝试了解决方案,但我得到了同样的错误。如何在泛型类型上调用静态方法?
答案 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链接它,因此不涉及移动/借位语义。 但是我在这里可能错了。