Rust中的通用结构体向量

10

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

pub trait Component {}

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

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

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

这旨在加快检索特定组件类型的列表,因为所有特定类型的组件实例将位于同一个组件列表中。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - E net4
我指的是针对Component(后者)的每个impl,使用Vec<ComponentList<c>> - EpicPotato
1
在这种情况下,您需要在结构体中为每个实现保留一个属性,或者使用具有动态调度的向量(如下面所见的第一个答案)。 - E net4
你觉得你能否澄清一下,我应该如何为每个实现保留一个属性? - EpicPotato
struct ComponentManager { component1: Component1, component2: Component2, ... } - E net4
1个回答

14
创建一个特质,每个 ComponentList<T> 都将实现该特质,但会隐藏 T。在该特质中,定义您需要操作组件列表的任何方法(当然,您将不得不使用像 &Component 这样的特质对象,而不能使用 T)。
trait AnyComponentList {
    // Add any necessary methods here
}

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

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

如果您想要从ComponentManager中高效查找基于TComponentList<T>,您可能需要考虑使用anymaptypemapanymap提供了一个简单的映射表,以类型为键(即您使用类型T作为键,并存储/检索类型T的值)。typemap通过将类型K的关联键与类型K::Value的值相关联来概括anymap


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接