Как создать итератор Rust для нескольких векторов, который возвращает следующий элемент в виде кортежа? - PullRequest
0 голосов
/ 30 марта 2020

Я делаю сущность-компонентную систему. Мои данные имеют векторы компонентов и вектор сущностей. У сущности есть дескрипторы различных компонентов, а у компонентов есть дескриптор их сущности.

let entities: Vec<Entity> = Vec::new();
let positions: Vec<PositionComponent> = Vec::new();
let sprites: Vec<SpriteComponent> = Vec::new();

Я хотел бы перебрать спрайты и получить позиции через сущность. Вот как я это делаю сейчас:

for sprite in &sprites {
    // get entity from the sprite's entity_handle
    let entity = &entities[sprite.entity_handle];
    // get position from the entity's position handle
    let position = &positions[entity.position_handle];
}

Посмотрев на amethyst / specs , я вижу, что они получают действительно красивый синтаксис итератора, и мне интересно, как этого добиться для мое собственное использование. Вот пример одного из их итераторов:

impl<'a> System<'a> for SysA {
    // These are the resources required for execution.
    // You can also define a struct and `#[derive(SystemData)]`,
    // see the `full` example.
    type SystemData = (WriteStorage<'a, Pos>, ReadStorage<'a, Vel>);

    fn run(&mut self, (mut pos, vel): Self::SystemData) {
        // The `.join()` combines multiple component storages,
        // so we get access to all entities which have
        // both a position and a velocity.
        for (pos, vel) in (&mut pos, &vel).join() {
            pos.0 += vel.0;
        }
    }
}

Я хотел бы иметь итератор, который возвращает кортеж sprite и position, аналогично приведенному выше примеру спецификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...