【问题标题】:Is it possible to have a generic function on a trait?是否可以在特征上具有通用功能?
【发布时间】:2018-04-21 05:18:39
【问题描述】:

我有:

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,如果对特定的Grumbo 实现有意义,可能用x 填充T

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

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

【问题讨论】:

  • 阅读this。这可能是重复的吗?

标签: generics rust traits


【解决方案1】:

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

是的。但是您随后尝试将特征用作对象。如果一个 trait 有一个泛型方法,那么你不能将它用作对象,但你仍然可以将它用作类型参数的绑定。

也就是说,不要使用&amp;'a Gumbo,而是使用T: Gumbo

struct Plumbus<'a, T: Gumbo> { 
    grumbo: &'a T,
}

使用 trait 对象,实现只在运行时才知道。而且它的泛型参数是实现类型的一部分,所以编译器不知道如何调用它。使用T: Gumbo,您可以限制T 可以是什么,但T 将始终被编译器在使用时知道,其中包括它自己的任何参数。

另见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 2018-07-20
    • 2017-06-24
    • 2019-08-15
    • 1970-01-01
    • 2018-01-04
    相关资源
    最近更新 更多