[英]Call static method from trait on generic type
我有一个不以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() {}
库的用户需要为任何类型实现 trait,通常是一个空结构。 我的一个函数接受一个实现MyTrait
的泛型类型。 当我尝试在泛型类型上调用function
方法时,它给了我这个错误:
错误:在当前范围内找不到类型
T
名为function
方法
我在这个问题的答案中尝试了解决方案,但我得到了同样的错误。 如何在泛型类型上调用静态方法?
当我尝试在泛型类型上调用
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);
}
两者在语义上是相同的; 只是当您涉及很多特征时,第二个更具体并且更有可能解决。
关注DK。 回答,您实际上并不需要将“对象:T”作为参数传递给您的函数。
你可以做
fn call_method<T: MyTrait>() {
let x = T::function(2);
}
事实上,如果我猜对了,您不会将此结构传递给函数,而只是通过 T 链接它,因此不涉及移动/借用语义。 但我在这里可能是错的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.