Mam problemy z życiem z określoną funkcją w moim kodzie. Podążam za tutorialem próbując poznać Rust i SDL. Samouczek był nieco starszy i biblioteka SDL zmieniła się od czasu jego napisania, więc podążam za nim, jednocześnie dostosowując go do najnowszej wersji Rust-SDL.Nie można określić odpowiedniego okresu istnienia autoref z powodu sprzecznych wymagań.
problememCzas życia jest w tej funkcji:
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)
})
}
zwłaszcza linii self.ttf_context.load_font(Path::new(font_path), size as u16).ok()
. Skomentowana linia powyżej to stara metoda ładowania czcionek w wersji 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>
Przedmiotem struct dla tej realizacji wygląda następująco:
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>>
}
Metoda próbuje załadować czcionkę z Phi na ttf_context
i załadować go do hashmap. Kompilator Rust zaproponował dodanie okresu życia do self
w parametrach funkcji, które, gdy to zrobiłem, powodowały efekt kaskadowy dodawania wcieleń do każdej metody wywołującej pierwotną, aż do main()
i nic nie pomogły.
Ponieważ wciąż jestem nowy w Rust, nie jestem pewien, gdzie znajduje się konflikt w życiu lub dlaczego tak się dzieje. Domyślam się, że obiekt Font
, który jest generowany, powinien umrzeć wraz z końcem tej metody, ale zamiast tego jest ładowany do mapy mieszającej o czasie trwania 'window
i tych dwóch konfliktów. Nie wiem jednak wystarczająco dużo o Rustu, żeby to naprawić, a nawet jeśli to prawda.
Mam to działa z Twoją pomocą! Dzięki! –
__FontLoader (a tym samym Font) nie żyje wystarczająco długo__: Czy żywotność 'FontLoadera' nie jest taka sama jak Phi, która go zawiera? –
@CarlLevasseur tak, życie "FontLoader" i jego zawierające 'Phi' są takie same. Dlaczego pytasz? – Shepmaster