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

アクター内に gm への不変の借用があり、それが存在する限り変更できません。

次のように const の借用に変更できます。

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

しかし、次の錆のリリースにまだ存在するかどうかはわかりません。(彼らは少なくともコンパイラでそれを取り除こうとします)

もう 1 つの方法は、@ ポインターを使用することです。その場合、借用の問題はありません:)

編集:コンパイルする 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 に答える