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

Epi*_*ato 6 generics rust

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

pub trait Component {}

struct ComponentList<T: Component> {
    components: Vec<T>,
}
Run Code Online (Sandbox Code Playgroud)

是否有可能创建这些ComponentLists 的集合?

struct ComponentManager {
    component_lists: Vec<ComponentList<_>>, // This does not work
}
Run Code Online (Sandbox Code Playgroud)

这旨在使检索某种Component类型的列表更快,因为某种类型的组件的所有实例都是相同的ComponentList.

Fra*_*gné 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>>,
}
Run Code Online (Sandbox Code Playgroud)

如果你想有一个有效的查找ComponentList<T>基于TComponentManager,你可能想看看anymaptypemap代替.anymap提供了一个由类型键入的简单映射(即您使用类型T作为键并存储/检索类型的值T).通过类型的关联键来typemap推广anymap类型K的值K::Value.