rust - probabilidad - Cómo inicializar los campos de estructura que se hacen referencia entre sí.
introduccion ala probabilidad y estadistica mendenhall 13th pdf (1)
No solo hay un problema con la inicialización, también podría haber problemas con la destrucción, si GameIterator
implementó Drop
: el compilador tendría que saber que necesita destruir game_iter
antes de game_window
, de lo contrario game_window
tendría una referencia a un GameWindowGLFW
destruido mientras ejecuta su método drop()
No hay manera de pasar la vida útil de la estructura como un argumento de por vida. Lo único que puedes hacer es eliminar el campo MyGame
de MyGame
y pasar una instancia de MyGame
al inicializador de MyGame
. Si desea encapsular esto para que el usuario no necesite crear un GameWindowGLFW
, puede escribir un método que cree un GameWindowGLFW
y un MyGame
en la pila y llame a un cierre que solo acepte un argumento de 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 */
});
}
Actualmente quiero definir una estructura para un juego de Piston usando GamerIterator:
pub struct MyGame<''a> {
game_window: GameWindowGLFW,
game_iter: GameIterator<''a, GameWindowGLFW>,
//...
}
El GameIterator
es genérico en GameWindow
y su vida útil. Quiero decirle al compilador que tiene la misma vida útil que el campo "game_window" / "the whole struct" y omitir la vida útil de la estructura.
También tengo dificultades para inicializar esto:
MyGame {
game_window: GameWindowGLFW::new(GameWindowSettings {/*...*/},
game_iter: GameIterator::new(&mut game_window, &game_iter_settings), // game_window cannot be used here
//...
}
Creo que puedo Option<GameIterator<...>>
el problema de la inicialización utilizando la Option<GameIterator<...>>
y un método init (), pero me gustaría evitar esto porque puedo garantizar que el game_iter
esté presente después de que game_iter
new()
.
¿Cuál es la forma idiomática de escribir esto?