【发布时间】: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<()> for MyStruct { ... }。
标签: generics rust optional traits