【问题标题】:Is it possible to have an optional generic type for a trait?是否可以为特征提供可选的泛型类型?
【发布时间】:2021-07-22 14:38:57
【问题描述】:

我需要一个特征的可选泛型类型,我正在尝试找出如何以一种很好的方式实现它。这是一个我需要它作为状态结构的示例:

impl<T> MyTrait<T> for MyStruct {
    type Value = MyState<T>;

    fn some_function(&self, state: &Self::Value) {
        ...
    }
    ...
}

这是另一个我根本不需要它的例子:

impl MyTrait for MyStruct {
    type Value = MyState;

    fn some_function(&self, state: &Self::Value) {
        ...
    }

    ...
}

泛型类型仅用于定义 MyState 结构中的字段类型。 MyState 结构本身总是根据用例以完全不同的方式定义,并且在所有情况下都不需要泛型类型。

我知道具有可选泛型类型的结构存在 PhantomData,我想知道特征是否有类似的东西。不幸的是,我还没有找到任何东西。

我可以用 PhantomData 添加另一种类型吗?像这样:

impl<T> MyTrait<T> for MyStruct {
    type Value = MyState;
    type Phantom = PhantomData<T>;

    fn some_function(&self, state: &Self::Value) {
        ...
    }
    ...
}

Rust 可能会抱怨未使用的类型。

最后,我将它添加到一个巨大的代码库中,其中已经给出了 Trait 结构并在许多地方使用。我希望我不需要接触太多已经存在的代码。

【问题讨论】:

  • 在这种情况下如何使用T?
  • State 结构包含一个 HashMap。状态用于图形分析,其中每个节点都有一个状态。 T 用于在地图中存储不同种类的信息。在某些情况下,由于 Graph Analysis 完全不同,因此 State 结构体没有此映射。
  • 将 PhantomData 添加到所有现有的 State 实现中是否合适?这种方式 T 不需要是可选的。在我看来,这是一个肮脏的解决方法。
  • 请将该信息合并到问题中。如果做成合适的minimal reproducible example就更好了。
  • 在为MyStruct 实施MyTrait 时,是否需要为每个 T 实施MyTrait?如果没有,你可以impl MyTrait&lt;()&gt; for MyStruct { ... }。

标签: generics rust optional traits


【解决方案1】:

如果您不需要为每一种种T实现MyTrait&lt;T&gt;,您可以选择一个虚拟类型来为MyStruct参数化它:

impl MyTrait<()> for MyStruct {
    // ...
}

【讨论】:

  • ...在常见的情况下,您可以将其设为特征定义中的默认值。
  • @eggyal 很好的一般建议,但可能不适用于 OP 的情况,因为“特征结构已经给出并在许多地方使用”。
  • 但这不是一个突破性的变化?
  • @eggyal 对我来说“已经给出”听起来像是 OP 无法修改那部分代码,但这可能只是我的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 2019-11-04
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多