Rust 如何初始化相互引用的结构字段
我当前想使用GameWriter为游戏定义一个结构:Rust 如何初始化相互引用的结构字段,rust,Rust,我当前想使用GameWriter为游戏定义一个结构: pub struct MyGame, //... } GameIterator在GameWindow及其生存期中是通用的。我想告诉编译器,它与字段“game\u window”/“thewholestruct”具有相同的生存期,并省略该结构的生存期 我也很难初始化这个: MyGame { game_window: GameWindowGLFW::new(GameWindowSettings {/*...*/}, game_i
pub struct MyGame,
//...
}
GameIterator
在GameWindow
及其生存期中是通用的。我想告诉编译器,它与字段“game\u window”/“thewholestruct”具有相同的生存期,并省略该结构的生存期
我也很难初始化这个:
MyGame {
game_window: GameWindowGLFW::new(GameWindowSettings {/*...*/},
game_iter: GameIterator::new(&mut game_window, &game_iter_settings), // game_window cannot be used here
//...
}
我认为我可以通过使用选项和init()方法来解决初始化问题,但我希望避免这种情况,因为我可以保证游戏iter
在新建()完成后出现
写这篇文章的惯用方法是什么?如果GameIterator
实现Drop
:编译器必须知道它需要在game\u窗口
之前销毁game\u iter
,否则,game_window
在运行其drop()
方法时,将引用已销毁的GameWindowGLFW
无法将结构本身的生存期作为生存期参数传递。您唯一能做的就是从MyGame
中删除game\u窗口
字段,并将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 */
});
}
pub struct MyGame,
//...
}
恳求{
fn new(game_window:&'a mut GameWindowGLFW)->MyGameThank,我知道原因,但奇怪的是它不起作用……也无法想出一个编译器可以轻松验证的安全和通用的解决方案,所有这些都取决于依赖项和初始化/销毁顺序。