当您克隆self.0
到coco
时,您正在使用以下 for 循环HashMap
。因此,当您修改时,x
您实际上并没有影响 中的键coco
,因为您不能改变 中的键HashMap
。
而是将 for 循环的主体包装在 a 中map()
,然后collect()
将结果返回self.0
.
您的+=
/-=
键也被翻转。
fn press(&mut self, args: &Button) {
let coco = self.0.clone();
self.0 = coco
.into_iter()
.map(|(mut x, y)| {
if let &Button::Keyboard(key) = args {
match key {
// Key::Up => x.1 -= 1,
Key::Down => x.1 += 1,
Key::Left => x.0 -= 1,
Key::Right => x.0 += 1,
_ => {
println!("{:?}", x);
}
};
}
(x, y)
})
.collect();
}
或者,如果您想避免预先克隆整个HashMap
文件,则可以使用.iter()
and clone()
in map()
。
fn press(&mut self, args: &Button) {
self.0 = self
.0
.iter()
.map(|(x, &y)| {
let mut x = x.clone();
if let &Button::Keyboard(key) = args {
match key {
// Key::Up => x.1 -= 1,
Key::Down => x.1 += 1,
Key::Left => x.0 -= 1,
Key::Right => x.0 += 1,
_ => {
println!("{:?}", x);
}
};
}
(x, y)
})
.collect::<HashMap<_, _>>();
}
或者你可以mem::replace()
和extend()
。
fn press(&mut self, args: &Button) {
let coco = std::mem::replace(&mut self.0, HashMap::new());
self.0.extend(coco.into_iter().map(|(mut x, y)| {
if let &Button::Keyboard(key) = args {
match key {
// Key::Up => x.1 -= 1,
Key::Down => x.1 += 1,
Key::Left => x.0 -= 1,
Key::Right => x.0 += 1,
_ => {
println!("{:?}", x);
}
};
}
(x, y)
}));
}
此外,我强烈建议使用rustfmt来保持代码格式良好,更不用说英文和非英文名称的混合会造成混淆。