我正在尝试创建一个矢量来跟踪游戏中的敌人,该游戏将包含一堆可变结构。我有一个世界结构,其中有敌人,如下所示:
pub struct World {
pub player : Creature,
pub enemies : Vec<Creature>,
}
我按如下方式创建敌人向量:
let mut enemies = vec![];
let mut enemy = Creature::new(5, 5, map_start_x+5, map_start_y+5, "$", 10, 1, "")
enemies.push(enemy);
稍后在代码中,当我从 enemies
中拉出单个敌人进行攻击并尝试按如下方式更新 hp 时:
for enemy in self.enemies.iter() {
if new_x == enemy.x && new_y == enemy.y {
enemy.hp -= self.player.damage;
return;
}
}
这就是问题所在,因为此时 enemy 显然是不可改变的
error: cannot assign to immutable field `enemy.hp`
最佳答案
更新到最新的 Rust 版本
Rust 中的可变性与数据结构无关,它是存储数据的地方(读作:变量)的属性。也就是说,如果您将值放在可变槽中:
let mut world = World::new();
然后您可以对这个变量进行可变引用,从而调用可以改变它的方法。
您的结构拥有它包含的所有数据,因此您可以在需要时随时使其可变。 self.enemies.iter()
返回一个迭代器,它生成 &Creature
类型的项目 - 不可变引用,因此您不能使用它们来改变结构。但是,还有另一种向量方法,称为 iter_mut()
。此方法返回一个生成 &mut Creature
的迭代器 - 可变引用,它允许更改它们指向的数据。
for enemy in self.enemies.iter_mut() {
if new_x == enemy.x && new_y == enemy.y {
enemy.hp -= self.player.damage;
return;
}
}
// The following also works (due to IntoIter conversion)
for enemy in &mut self.enemies {
if new_x == enemy.x && new_y == enemy.y {
enemy.hp -= self.player.damage;
return;
}
}
请注意,为了使其工作,您还必须通过可变引用传递 self
,否则将无法更改其下的任何内容,这意味着您将无法获得对结构内部的可变引用,包括向量的项。简而言之,确保包含此循环的任何方法定义如下:
fn attack(&mut self, ...) { ... }
关于vector - 向量中的可变结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23585651/