我对Rust还是有点陌生,所以我不太确定如何正确地重组我的代码以使我想做的事情成为可能。 Here是我正在运行的代码的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
我应该如何构造我的代码,以便我可能要做的事情?
答案 0 :(得分:1)
我将您的示例中的第16行分开,以解释发生的事情(我认为):
即来自
let action = self.entities[self.current_entity].get_action(self);
收件人:
let entity = &mut self.entities[self.current_entity];
let action = entity.get_action(self);
在上面,entity
可变地指向self
(通过self.entities
间接)。因此,get_action
无法修改self
,因为它尤其可以更改self.entities
,从而使引用entity
无效。 (安全)Rust不允许这样做。
您可以尝试将Level
分为entities
和noentities
。这使您可以显式指定Level
的哪些部分实际上是可变的。 (有关更新的示例,请参见https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=a8199f0bd4f8119f2ec1e79f9ebb542d。)
即你会
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);
现在,entity
仅引用self.entities
,并且您仍然可以传递noentities
,因为编译器现在知道您可变地仅引用Level
的一部分。 / p>