根据可变结构字段的值调用可变方法

问题描述 投票:0回答:1

我对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

我应该如何构造我的代码,以便我可能要做的事情?

data-structures rust borrow-checker
1个回答
0
投票

我从您的示例中分割了第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分为entitiesnoentities。这使您可以明确指定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的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.