vector - 向量中的可变结构

标签 vector struct rust

我正在尝试创建一个矢量来跟踪游戏中的敌人,该游戏将包含一堆可变结构。我有一个世界结构,其中有敌人,如下所示:

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/

相关文章:

rust - 如何读取bevy中的鼠标运动?

rust - 通过网络发送 "application/x-www-form-urlencoded"数据代替 JSON

rust - 在bufreader.lines()的for循环后无法使用移动的BufReader

java - 在 vector 类中加载 vector (Java)

haskell - 在另一个数据构造函数中写入 STVector

java - 从另一个 vector 中找出两个垂直 vector

c++ - 我可以制作一个线程安全的 std::atomic<vector<int>> 吗?

c++ - 结构大小与 typedef 版本不同?

c - 将包含数据的文本文件读取到链接列表中

c - ‘sizeof’ 对不完整类型的无效应用