2

我试图使示例代码尽可能简单

struct Level;

pub struct GameManager<'self>{
    lvl: Level,
    actors: ~[Actor<'self>]
}
struct Actor<'self>{
    lvl: &'self Level
}
impl<'self> GameManager <'self> {
    pub fn new() -> GameManager{
        GameManager {lvl: Level,actors: ~[]}
    }
    fn spawn_actor<'r>(&'r self) -> Actor<'r>{
        Actor{lvl: &'r self.lvl}
    }
}
fn main() {
    let mut gm = GameManager::new();

    let mut actor1 = gm.spawn_actor();

    gm.actors.push(actor1);


}

错误:

/home/maik/source/test.rs:23:4: 23:13 error: cannot borrow `gm.actors` as mutable because it is also borrowed as immutable
/home/maik/source/test.rs:23     gm.actors.push(actor1);
                                 ^~~~~~~~~
/home/maik/source/test.rs:21:21: 21:23 note: second borrow of `gm.actors` occurs here
/home/maik/source/test.rs:21     let mut actor1 = gm.spawn_actor();

如您所见,我希望 GameManager 生成一个演员。一个 GameManager 作为一个关卡,我希望所有生成的演员都有一个对 GameManager 关卡的引用。

有人可以向我解释这个错误吗?我如何解决它?

4

2 回答 2

3

在 Rust 中似乎是不可能的。

但我找到了一个解决方案,我只需要封装更多,比如

struct Level;
pub struct ActorController{
    lvl: Level
}
pub struct GameManager<'self>{
    actors: ~[Actor<'self>],
    actor_controller: ActorController
}
struct Actor<'self>{
    lvl: &'self Level
}
impl ActorController {
    fn spawn_actor<'r>(&'r self) -> Actor<'r>{
        Actor{lvl: &'r self.lvl}
    }
}
impl<'self> GameManager <'self> {
    pub fn new() -> GameManager{
        GameManager {actors: ~[], actor_controller: ActorController{lvl: Level}}
    }
}
fn main() {
    let mut gm = GameManager::new();

    let actor1 = gm.actor_controller.spawn_actor();

    gm.actors.push(actor1);


}
于 2013-08-10T10:14:21.190 回答
2

您在 Actor 内部对 gm 有一个不可变的借用,并且只要它存在就不能对其进行修改。

您可以将其更改为 const 借用,如下所示:

struct Actor<'self>{
    lvl: &'self const Level
}

但我不确定它是否会在下一个 rust 版本中存在。(他们至少试图在编译器中摆脱它)

另一种选择是使用@-pointers。那时你不会有任何借用问题:)

编辑:这是编译的 const 的整个代码

struct Level;

pub struct GameManager<'self>{
    lvl: Level,
    actors: ~[Actor<'self>]
}
struct Actor<'self>{
    lvl: &'self const Level
}
impl<'self> GameManager <'self> {
    pub fn new() -> GameManager{
        GameManager {lvl: Level,actors: ~[]}
    }
    fn spawn_actor<'r>(&'r const self) -> Actor<'r>{
        Actor{lvl: &'r const self.lvl}
    }
}
fn main() {
    let mut gm = GameManager::new();

    let mut actor1 = gm.spawn_actor();

    gm.actors.push(actor1);
}
于 2013-08-09T10:05:24.187 回答