我有:
struct Plumbus<'a> {
grumbo: &'a Grumbo,
}
trait Grumbo {
fn dinglebop<T>(&self, x: &mut T) -> bool { false }
}
但我明白了:
error[E0038]: the trait `Grumbo` cannot be made into an object
--> plumbus.rs:4:5
|
4 | grumbo: &'a Grumbo,
| ^^^^^^^^^^^^^^^^^^ the trait `Grumbo` cannot be made into an object
|
= note: method `dinglebop` has generic type parameters
我希望默认情况下dinglebop
不执行任何操作,但取决于Grumbo
和T
,如果有x
,可能会填T
对于特定的Grumbo
实现有意义。
在C ++中,这可能可以通过部分特化来完成。我不确定Rust的目标是什么。
dinglebop()
专门用于特定 T
的情况下实现Plumbus
任意T
的目标?答案 0 :(得分:2)
是否可以在特征上使用泛型函数?
是。但是,您正在尝试将特征用作对象。如果特征具有泛型方法,那么您不能将其用作对象,但仍可以将其用作类型参数的边界。
即使用&'a Gumbo
:
T: Gumbo
struct Plumbus<'a, T: Gumbo> {
grumbo: &'a T,
}
使用trait对象,实现仅在运行时才知道。它的泛型参数是实现类型的一部分,因此编译器无法知道如何调用它。使用T: Gumbo
,您对T
可能存在约束,但编译器在使用时始终会知道T
,其中包含自己的任何参数。
另见: