我对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
我应该如何构造我的代码,以便我可能要做的事情?
我从您的示例中分割了第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
的一部分。