我正在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
。
答案 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
,您可能需要查看anymap
或typemap
代替。 anymap
提供了一个由类型键入的简单映射(即,您使用类型T
作为键并存储/检索类型T
的值)。 typemap
通过类型为anymap
的关键字K
推广K::Value
。