通用结构传染媒介在铁锈的

时间:2016-10-15 22:04:49

标签: generics rust

我正在Rust中创建一个实体组件系统,我希望能够为每个不同的Vec类型存储Component个组件:

pub trait Component {}

struct ComponentList<T: Component> {
    components: Vec<T>,
}

是否可以创建这些ComponentList的集合?

struct ComponentManager {
    component_lists: Vec<ComponentList<_>>, // This does not work
}

这是为了更快地检索某个Component类型的列表,因为某个类型的组件的所有实例都在同一个ComponentList

1 个答案:

答案 0 :(得分:6)

创建一个特征,每个ComponentList<T>将实现但会隐藏T。在该特征中,定义在组件列表上操作所需的任何方法(您将无法使用T,当然,您必须使用特征对象,如&Component)。

trait AnyComponentList {
    // Add any necessary methods here
}

impl<T: Component> AnyComponentList for ComponentList<T> {
    // Implement methods here
}

struct ComponentManager {
    component_lists: Vec<Box<AnyComponentList>>,
}

如果您希望根据ComponentList<T>中的T高效查找ComponentManager,您可能需要查看anymaptypemap代替。 anymap提供了一个由类型键入的简单映射(即,您使用类型T作为键并存储/检索类型T的值)。 typemap通过类型为anymap的关键字K推广K::Value