Je rencontre des problèmes de durée de vie avec une fonction particulière dans mon code. Je suis un tutoriel pour essayer d'apprendre Rust et SDL. Le tutoriel était un peu plus ancien et la librairie SDL a changé depuis son écriture, donc je suis en train de l'accompagner tout en l'adaptant à la dernière version de Rust-SDL.Impossible de déduire une durée de vie appropriée pour autoref en raison d'exigences contradictoires
Le problème de la durée de vie est dans cette fonction:
pub fn ttf_str_sprite(&mut self, text: &str, font_path: &'static str, size: i32, color: Color) -> Option<Sprite> {
if let Some(font) = self.cached_fonts.get(&(font_path, size)) {
return font.render(text).blended(color).ok()
.and_then(|surface| self.renderer.create_texture_from_surface(&surface).ok())
.map(Sprite::new)
}
//::sdl2_ttf::Font::from_file(Path::new(font_path), size).ok()
self.ttf_context.load_font(Path::new(font_path), size as u16).ok()
.and_then(|font| {
self.cached_fonts.insert((font_path, size), font);
self.ttf_str_sprite(text, font_path, size, color)
})
}
particulièrement avec la ligne self.ttf_context.load_font(Path::new(font_path), size as u16).ok()
. La ligne commentée au-dessus est la méthode de chargement des polices de l'ancienne version de SDL.
error[E0495]: cannot infer an appropriate lifetime for autoref due to conflicting requirements
--> src\phi/mod.rs:57:26
|
57 | self.ttf_context.load_font(Path::new(font_path), size as u16).ok()
| ^^^^^^^^^
|
help: consider using an explicit lifetime parameter as shown: fn ttf_str_sprite(&'window mut self, text: &str, font_path: &'static str,
size: i32, color: Color) -> Option<Sprite>
L'objet struct pour cette mise en œuvre se présente comme suit:
pub struct Phi<'window> {
pub events: Events,
pub renderer: Renderer<'window>,
pub ttf_context: Sdl2TtfContext,
cached_fonts: HashMap<(&'static str, i32), ::sdl2_ttf::Font<'window>>
}
La méthode tente de charger une police de Phi et de ttf_context
charger dans le hashmap. Le compilateur Rust suggérait d'ajouter une durée de vie à self
dans les paramètres de la fonction, ce qui, en faisant cela, provoquait un effet en cascade d'ajouter des durées de vie à toutes les méthodes appelant l'original, jusqu'à main()
et n'aidait en rien. Depuis que je suis encore nouveau à Rust, je ne suis pas sûr où réside le conflit de la vie ou pourquoi cela se produit. En guise de supposition, je pense que l'objet Font
qui est en train d'être généré est censé mourir à la fin de cette méthode mais à la place il est chargé dans un hashmap avec une durée de vie de 'window
et ces deux conflits. Je ne connais pas assez Rust pour résoudre ce problème, ou si c'est correct.
Je l'ai eu travailler avec votre aide! Merci! –
__FontLoader (et donc Font) ne vit pas assez longtemps__: La durée de vie de 'FontLoader' n'est-elle pas la même que celle de Phi qui le contient? –
@CarlLevasseur Oui, la durée de vie de 'FontLoader' et de son contenu' Phi' sont les mêmes. Pourquoi demandez-vous? – Shepmaster