我有一个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
的正确(甚至更惯用的)方法是什么?