我具有一个特征,该特征具有一个不以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的答案中的解决方案,但遇到相同的错误。如何在泛型类型上调用静态方法?
当我尝试在通用类型上调用
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;只是当您涉及很多特质时,第二个更具体,更可能解决。
fn call_method<T: MyTrait>() {
let x = T::function(2);
}
实际上,如果我做对了,您没有将这个结构传递给函数,而只是通过T链接了它,因此不涉及移动/借位语义。
但是我可能在这里错了。