从泛型类型的特征调用静态方法
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() {}
库的用户需要为任何类型实现特征,通常是空结构。我的一个函数接受实现 MyTrait
的泛型类型。当我尝试在泛型类型上调用 function
方法时,它给了我这个错误:
error: no method named function
found for type T
in the current scope
我尝试了 this question 的答案中的解决方案,但我得到了同样的错误。如何在泛型类型上调用静态方法?
When I try to call the function
method on the generic type, ...
两件事:首先,取决于您如何看待它,function
不是 一种方法。它只是一个恰好存在于特征命名空间中的函数 (a.k.a. 和 "associated 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。回答,你实际上不需要将 "object: T" 作为参数传递给你的函数。
你可以做到
fn call_method<T: MyTrait>() {
let x = T::function(2);
}
事实上,如果我没弄错的话,您并不是将此结构传递给函数,而只是通过 T 链接它,因此不涉及 move/borrow 语义。 但我这里可能是错的。
我有一个不以 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
方法时,它给了我这个错误:
error: no method named
function
found for typeT
in the current scope
我尝试了 this question 的答案中的解决方案,但我得到了同样的错误。如何在泛型类型上调用静态方法?
When I try to call the
function
method on the generic type, ...
两件事:首先,取决于您如何看待它,function
不是 一种方法。它只是一个恰好存在于特征命名空间中的函数 (a.k.a. 和 "associated 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。回答,你实际上不需要将 "object: T" 作为参数传递给你的函数。
你可以做到
fn call_method<T: MyTrait>() {
let x = T::function(2);
}
事实上,如果我没弄错的话,您并不是将此结构传递给函数,而只是通过 T 链接它,因此不涉及 move/borrow 语义。 但我这里可能是错的。