【问题标题】:Is there an elegant way to make a generic tuple struct with an unused type without PhantomData?有没有一种优雅的方法来制作一个没有 PhantomData 的未使用类型的通用元组结构?
【发布时间】:2015-09-25 15:53:29
【问题描述】:

我想创建一个通用元组结构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&lt;T&gt; 字段并编写构造函数 Producer::new(p: P) 来将其隐藏为实现细节来解决此问题。但是,我在 Builder API 中将这种类型用作元组结构系列之一,因此使用传统的 struct + 构造函数感觉非常不合适。

有什么办法可以做到吗?

【问题讨论】:

    标签: struct tuples rust traits


    【解决方案1】:

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

    trait Produce {
        type T;
    
        fn get(&mut self) -> Self::T;
    }
    
    struct Producer<P>(P) where P: Produce;
    
    fn main() {}
    

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

    【讨论】:

    • 这很完美!我正在使用它来更改对象池库的构建器 API 中的设置。我已经更新了the tuple struct 及其updated usage 的文档。谢谢!
    猜你喜欢
    • 2011-09-18
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多