迭代过程中的复杂向量处理

时间:2018-09-17 13:45:23

标签: vector rust iteration borrow-checker

我有一个GameLog结构体Vec<Steps>Steps拥有Vec<FieldData>,而FieldData仅包含基本数据类型。

我使用serde_json创建这些类型的实例。反序列化完成后,我需要遍历GameData中的所有步骤,并向其添加尚未包含的下一轮更改的字段的过去版本。

我有一个正在尝试移植到Rust的有效Java实现,但我无法弄清楚这一点,可能是因为我对Rust的内部了解不足。

当前代码如下:

let data = load_data("Path/to/json");
let mut gamelog: Vec<Vec<FieldData>> = Vec::with_capacity(data.steps.len() + 1);
gamelog.push(Vec::with_capacity(data.init.fields.len()));
gamelog[0] = data.init.fields;
for i in 1..(data.steps.len() - 1) {
    gamelog.push(Vec::with_capacity(data.steps[i - 1].fields.len()));
    gamelog[i] = data.steps[i - 1].fields.clone();
    for future_field in &data.steps[i + 1].fields {
        let mut inside = false;
        for current_field in &data.steps[i].fields {
            if current_field.x == future_field.x && current_field.y == future_field.y {
                inside = true;
            }
        }
        if !inside {
            for j in i..0 {
                let mut insideb = false;
                for past_field in &data.steps[j].fields {
                    if future_field.x == past_field.x && future_field.y == past_field.y {
                        gamelog[i].push(past_field.clone());
                        insideb = true;
                        break;
                    }
                }
                if insideb {
                    break;
                }
            }
        }
    }
}

但是,这只能通过创建矢量和字段的副本并创建新的Vec来起作用。 当我尝试直接操作Vec时,通常会在for .. in data.steps[?].fields行上看到“无法移出借用”错误

直接操纵结构中的Vec的正确(甚至更惯用的)方法是什么?

0 个答案:

没有答案