是否可以在特征上使用泛型函数?

时间:2018-04-21 05:18:39

标签: generics rust traits

我有:

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不执行任何操作,但取决于GrumboT,如果有x,可能会填T对于特定的Grumbo实现有意义。

在C ++中,这可能可以通过部分特化来完成。我不确定Rust的目标是什么。

  • 是否可以在特质上使用这样的通用函数?
  • 如何在没有将dinglebop()专门用于特定 T的情况下实现Plumbus任意T的目标?

1 个答案:

答案 0 :(得分:2)

  

是否可以在特征上使用泛型函数?

是。但是,您正在尝试将特征用作对象。如果特征具有泛型方法,那么您不能将其用作对象,但仍可以将其用作类型参数的边界。

即使用&'a Gumbo

,而不是使用T: Gumbo
struct Plumbus<'a, T: Gumbo> { 
    grumbo: &'a T,
}

使用trait对象,实现仅在运行时才知道。它的泛型参数是实现类型的一部分,因此编译器无法知道如何调用它。使用T: Gumbo,您对T可能存在约束,但编译器在使用时始终会知道T,其中包含自己的任何参数。

另见: