Rust实现ECS多组件同索引迭代遇借用问题求助
Rust ECS多组件迭代实现困境
背景
我正在实现一个实体组件系统(ECS),组件存储在基于AnyMap的packed array中。这里的packed array是一种用索引对应实体ID的结构(比如索引5的组件属于ID为5的实体),但因为不是所有实体都有全部组件,为了内存紧凑,采用了Vec<IndexedElem<T>>的结构:
pub struct PackedArray<T> { data: Vec<IndexedElem<T>>, } pub struct IndexedElem<T> { pub index: usize, pub elem: T }
组件表本身是存储上述PackedArray的AnyMap:
pub struct ComponentTable { components: anymap::Map, }
创建实体、增删查组件等基础功能已实现,但核心的多组件迭代功能卡住了。
问题与尝试
单组件迭代很简单,直接遍历Vec即可,但要迭代同时拥有C1和C2组件的实体对应的组件对时,遇到了Rust所有权与借用规则的阻碍。
我的思路是:获取两个packed数组的迭代器,从current_entity_id=0开始,检查两个迭代器的IndexedElem是否匹配当前ID,匹配则返回组件对,不匹配则推进迭代器。
我定义了迭代器结构体:
pub struct ComponentIterator_2<'a, C1, C2> { iterator_1: std::slice::IterMut<'a, IndexedElem<C1>>, iterator_2: std::slice::IterMut<'a, IndexedElem<C2>>, current_entity: usize, }
但在构建该迭代器的方法中,无法两次可变借用self.components:
pub fn iterate_over_2_component<'a, C1: 'static, C2: 'static>(&'a mut self) -> Option<ComponentIterator_2<'a, C1, C2>> { return Some(ComponentIterator_2::<C1, C2> { iterator_1: match self.components.get_mut::<PackedArray<C1>>() { None => return None, Some(packed_array) => packed_array.iter_mut(), }, iterator_2: match self.components.get_mut::<PackedArray<C2>>() { None => return None, Some(packed_array) => packed_array.iter_mut(), }, current_entity: 0, }); }
我清楚这是Rust不允许对同一值进行两次可变借用导致的,但找不到可行的解决办法,恳请提供正确且高效的实现思路。
内容的提问来源于stack exchange,提问作者LucioleMaléfique
相关产品推荐
相关产品推荐

