bonjour à tous,
Je reviens vers vous avec un "classique" soucis de lifetime avec une hashMap. Je veux créer un gestionnaire de scene pour un jeu, J'utilise une HashMap pour stocker mes scenes enregistrées avec une clé string et une valeur Box<dyn Scene>, où Scene est un Trait. Voici mon code :
J'ai besoin de récupérer la &mut scene dans self.current_scene pour pouvoir ensuite appeler les methodes update() et draw() sur la scene en cours et je n'y arrive pas. J'ai tenter de mettre une lifetime sur current_scene, mais les soucis persistent.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 pub trait Scene { fn update(&mut self); fn draw(&self); } pub struct SceneManager { scenes : HashMap<String, Box<dyn Scene>>, current_scene : Option<Box<dyn Scene>>, } impl SceneManager { pub fn new() -> Self { SceneManager { scenes : HashMap::new(), current_scene : None, } } pub fn add(&mut self, name : &str, scene : Box<dyn Scene>) { self.scenes.insert(String::from(name), scene); match self.scenes.get_mut(name) { Some(scene) => self.current_scene = Some(Box::new(scene)), // ici ERREUR, pas possible de récupérer une ref mutable sur ma scene enregistrée None => () } } } pub struct SceneGame { name : String, } impl Scene for SceneGame { ...}
Je comprend que get() ou get_mut() de HashMap me renvoie une référence, mais je ne comprends pas comment transmettre cette référence à current_scene.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 pub struct<'a> { ... current_scene : Option<&'a Box<dyn Scene>>, mais le soucis n'est pas réglé. }
Voici ce que me renvoie le compilateur :
Je ne suis pas contre un petit coup de main.the trait bound `&mut std::boxed::Box<(dyn scene_manager::Scene + 'static)>: scene_manager::Scene` is not satisfied
the trait `scene_manager::Scene` is not implemented for `&mut std::boxed::Box<(dyn scene_manager::Scene + 'static)>`
note: required for the cast to the object type `dyn scene_manager::Scene`rustc(E0277)
main.rs(32, 58): the trait `scene_manager::Scene` is not implemented for `&mut std::boxed::Box<(dyn scene_manager::Scene + 'static)>`
Merci à tous et bonne journée.
Bringer
Partager