gpt4 book ai didi

rust - 借用GameMaster(自己)到GameState

转载 作者:行者123 更新时间:2023-11-29 08:19:46 24 4
gpt4 key购买 nike

我是 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
}

我认为这可以通过生命周期来解决,但我还没有找到让生命周期处理特征的方法。将 master 作为引用传递给每个函数调用也不起作用,因为一次只能持有一个可变引用。

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. 使用 Rc<RefCell<>>到处。记得还要使用 Weak如果您需要对这些对象进行垃圾回收,或者添加一个特殊的 destroy 方法,因为它们相互引用。

  2. 使用原始指针和不安全代码。问题是,对于不安全的遵从,除了生命周期检查之外,您还会失去可变性检查(RefCell 确保一次只存在一个可变引用)。

关于rust - 借用GameMaster(自己)到GameState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58314563/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com