我目前想定义一个结构体Piston使用 GamerIterator 进行游戏:
pub struct MyGame<'a> {
game_window: GameWindowGLFW,
game_iter: GameIterator<'a, GameWindowGLFW>,
//...
}
The 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
before game_window
, 否则game_window
会引用一个被毁坏的GameWindowGLFW
运行时drop()
method.
无法将结构本身的生命周期作为生命周期参数传递。你唯一能做的就是删除game_window
字段来自MyGame
并通过一个GameWindowGLFW
实例到MyGame
的初始化器。如果你想封装它以便用户不需要创建GameWindowGLFW
,您可以编写一个方法来创建GameWindowGLFW
and a 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 */
});
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)