是否有一种优雅的方法来制作一个没有PhantomData的未使用类型的通用元组结构?

时间:2015-09-25 15:53:29

标签: struct tuples rust traits

我想创建一个通用元组结构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 +构造函数感觉非常不合适。

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:8)

在许多情况下,您不希望参数化您的特征,而是想要关联类型

trait Produce {
    type T;

    fn get(&mut self) -> Self::T;
}

struct Producer<P>(P) where P: Produce;

fn main() {}

不幸的是,如果不了解更多有关预期用例和代码示例的信息,很难判断这是否适合您,这可能对Stack Overflow来说过于冗长。