我目前想为 Piston 定义一个结构使用 GamerIterator 的游戏:
pub struct MyGame<'a> {
game_window: GameWindowGLFW,
game_iter: GameIterator<'a, GameWindowGLFW>,
//...
}
GameIterator
在 GameWindow
中是通用的及其生命周期。我想告诉编译器它与字段“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_iter
在 new()
之后出现完成。
写这个的惯用方式是什么?
最佳答案
不仅初始化有问题,如果 GameIterator
实现了 Drop
,也可能存在销毁问题:编译器必须知道它需要销毁game_iter
在 game_window
之前,否则 game_window
在运行其 drop( )
方法。
无法将结构本身的生命周期作为生命周期参数传递。您唯一可以做的就是从 MyGame
中删除 game_window
字段并将 GameWindowGLFW
实例传递给 MyGame
的初始值设定项。如果您想封装它以便用户不需要创建 GameWindowGLFW
,您可以编写一个方法来创建 GameWindowGLFW
和 MyGame
并调用一个仅接受 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/