Data structures 对来自可变结构字段的值调用可变方法
我还是一个新手,所以我不太确定如何正确地重新构造我的代码,以使我正在尝试做的事情成为可能这是指向我正在运行的代码的MCVE的链接 基本上,我要做的是遍历一个实体向量,并从每个实体中获取一个动作。我不需要该部分的可变借用,但我确实需要将对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
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);