Заимствование GameMaster (самостоятельно) для GameState - PullRequest
1 голос
/ 10 октября 2019

Я довольно новичок в Rust, и я пытался заставить простую игру работать с ggez .

Теперь, обычно в C ++ или C #, я бы структурировал свою игру, имея экземпляр «мастерского» класса, который заботится о настройках, ограничении фреймов, создании окон, обработке событий и т. Д. И классах «состояния», которыепроводятся мастер-классом. Я бы передал указатель на мастер-класс при создании класса состояний (что-то вроде game_master*), чтобы класс состояний мог получить доступ к ресурсам мастер-класса.

В Rust я не могу передать &mut self потому что государство потенциально может пережить ссылку.

pub fn new(_ctx: &mut Context) -> GameMaster {
    let game = GameMaster {
        state: None,
        pending_state: None
    };

    game.state = Some(Box::new(TestState::new_with_master(&mut game))) <----- NOPE
    game
}

Я думаю, что это можно решить с помощью жизней, но я не нашел способа заставить жизни работать с чертами. Передача мастера в качестве ссылки для каждого вызова функции также не работает, потому что одновременно может храниться только одна изменяемая ссылка.

fn update(&mut self, ctx: &mut Context) -> GameResult<()> {
    if self.state.is_some() {
        (*self.state.as_mut().unwrap()).update(ctx, &mut self) <----- NOPE
    } 
    else {
        Ok(())
    }
}

Нет ли хорошего способа сделать это в Rust?

1 Ответ

0 голосов
/ 10 октября 2019

У меня была похожая проблема некоторое время назад, но я думаю, что единственные варианты:

  1. используйте Rc<RefCell<>> везде. Не забудьте также использовать Weak или добавить специальный метод уничтожения, если вам когда-либо понадобится собрать эти объекты мусором, поскольку они содержат ссылки друг на друга.

  2. используют необработанные указатели и небезопасный код. Проблема заключается в том, что при небезопасном уважении вы также теряете проверку изменчивости (RefCell гарантирует, что одновременно существует только одна изменяемая ссылка) в дополнение к проверке срока службы.

...