我想创建一个通用元组结构Producer
,它可以包含任何类型P
,它实现了下面定义的特征Produce<T>
。这会产生(预期的)注释错误:
trait Produce<T> {
fn get(&mut self) -> T;
}
// ERROR: parameter `T` is never used [E0392]
struct Producer<P,T>(P) where P: Produce<T>;
如果这是一个非元组结构,我可以通过添加PhantomData<T>
字段并编写构造函数Producer::new(p: P)
来隐藏它作为实现细节来解决这个问题。但是,我在Builder API中使用此类型作为元组结构系列之一,因此使用传统的struct +构造函数感觉非常不合适。
有没有办法实现这个目标?
答案 0 :(得分:8)
在许多情况下,您不希望参数化您的特征,而是想要关联类型:
trait Produce {
type T;
fn get(&mut self) -> Self::T;
}
struct Producer<P>(P) where P: Produce;
fn main() {}
不幸的是,如果不了解更多有关预期用例和代码示例的信息,很难判断这是否适合您,这可能对Stack Overflow来说过于冗长。