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

zsl*_*ton 4 struct tuples traits rust

我想创建一个通用的元组结构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>;
Run Code Online (Sandbox Code Playgroud)

如果这是一个非元组结构,我可以通过添加一个PhantomData<T>字段并编写一个构造函数Producer::new(p: P)来隐藏它作为一个实现细节来解决这个问题.但是,我在Builder API中使用此类型作为元组结构系列之一,因此使用传统的struct +构造函数感觉非常不合适.

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

She*_*ter 8

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

trait Produce {
    type T;

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

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

fn main() {}
Run Code Online (Sandbox Code Playgroud)

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