Data structures 对来自可变结构字段的值调用可变方法

Data structures 对来自可变结构字段的值调用可变方法,data-structures,rust,borrow-checker,Data Structures,Rust,Borrow Checker,我还是一个新手,所以我不太确定如何正确地重新构造我的代码,以使我正在尝试做的事情成为可能这是指向我正在运行的代码的MCVE的链接 基本上,我要做的是遍历一个实体向量,并从每个实体中获取一个动作。我不需要该部分的可变借用,但我确实需要将对self的可变引用传递到函数后面的方法中,以执行返回的操作 下面是我得到的确切错误消息: error[E0502]: cannot borrow `*self` as immutable because it is also borrowed as mutable

我还是一个新手,所以我不太确定如何正确地重新构造我的代码,以使我正在尝试做的事情成为可能这是指向我正在运行的代码的MCVE的链接

基本上,我要做的是遍历一个实体向量,并从每个实体中获取一个动作。我不需要该部分的可变借用,但我确实需要将对
self
的可变引用传递到函数后面的方法中,以执行返回的操作

下面是我得到的确切错误消息:

error[E0502]: cannot borrow `*self` as immutable because it is also borrowed as mutable
  --> src/main.rs:16:72
   |
16 |             let action = self.entities[self.current_entity].get_action(self);
   |                          -------------                      ---------- ^^^^ immutable borrow occurs here
   |                          |                                  |
   |                          |                                  mutable borrow later used by call
   |                          mutable borrow occurs here

error: aborting due to previous error

我应该如何构造我的代码,以使我尝试做的事情成为可能?

我将您的示例中的第16行拆分,以解释(我认为)正在发生的事情:

即从

let action = self.entities[self.current_entity].get_action(self);
致:

在上文中,
实体
可变地指代
自我
(通过
自我实体
间接)。因此,
get\u action
无法修改
self
,因为它可以-尤其是-更改
self.entities
,从而使引用
实体
无效。这是不允许(安全)生锈的

您可以尝试将
级别
划分为
实体
无实体
。这允许您明确指定实际可变引用的
级别
的哪些部分。(有关更新的示例,请参见。)

也就是说,你会

struct LevelNoEntities {
    current_entity: usize,
    foo: i32,
}
struct Level {
    entities: Vec<Entity>,
    noentities: LevelNoEntities,
}

现在,
entity
只引用了
self.entities
,您仍然可以传递
noentities
,因为编译器现在知道您只能可变地引用
级别的一部分

@SCappella:哇,这非常有用。更棒的是,它还教会了我为什么不允许,以及一些可行的解决方案。我要去睡觉了,但一旦我回到代码上,如果到时候还没有一个有效的答案,我会发布我最终为后代使用的任何东西。你认为这些解决方案中哪一个是最好的?
struct LevelNoEntities {
    current_entity: usize,
    foo: i32,
}
struct Level {
    entities: Vec<Entity>,
    noentities: LevelNoEntities,
}
let entity = &mut self.entities[self.noentities.current_entity];
let action = entity.get_action(&self.noentities);