gpt4 book ai didi

rust - 如何初始化相互引用的结构字段

转载 作者:行者123 更新时间:2023-11-29 08:01:22 25 4
gpt4 key购买 nike

我目前想为 Piston 定义一个结构使用 GamerIterator 的游戏:

pub struct MyGame<'a> {
game_window: GameWindowGLFW,
game_iter: GameIterator<'a, GameWindowGLFW>,
//...
}

GameIteratorGameWindow 中是通用的及其生命周期。我想告诉编译器它与字段“game_window”/“整个结构”具有相同的生命周期,并省略结构的生命周期。

我也很难初始化这个:

MyGame {
game_window: GameWindowGLFW::new(GameWindowSettings {/*...*/},
game_iter: GameIterator::new(&mut game_window, &game_iter_settings), // game_window cannot be used here
//...
}

我认为我可以通过使用 Option<GameIterator<...>> 解决初始化问题和一个 init() 方法,但我想避免这种情况,因为我可以保证 game_iternew() 之后出现完成。

写这个的惯用方式是什么?

最佳答案

不仅初始化有问题,如果 GameIterator 实现了 Drop,也可能存在销毁问题:编译器必须知道它需要销毁game_itergame_window 之前,否则 game_window 在运行其 drop( ) 方法。

无法将结构本身的生命周期作为生命周期参数传递。您唯一可以做的就是从 MyGame 中删除 game_window 字段并将 GameWindowGLFW 实例传递给 MyGame 的初始值设定项。如果您想封装它以便用户不需要创建 GameWindowGLFW,您可以编写一个方法来创建 GameWindowGLFWMyGame 并调用一个仅接受 MyGame 参数的闭包。

pub struct MyGame<'a> {
game_iter: GameIterator<'a, GameWindowGLFW>,
//...
}

impl<'a> MyGame<'a> {
fn new(game_window: &'a mut GameWindowGLFW) -> MyGame<'a> {
MyGame {
game_iter: GameIterator { game_window: game_window },
}
}
}

fn start_game(callback: |game: &mut MyGame|) {
let mut game_window = GameWindowGLFW;
let mut game = MyGame::new(&mut game_window);
callback(&mut game);
}

fn main() {
start_game(|game| {
/* use game here */
});
}

关于rust - 如何初始化相互引用的结构字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31093330/

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