Tôi đang gặp sự cố với một chức năng cụ thể trong mã của mình. Tôi đang theo một hướng dẫn trong một nỗ lực để tìm hiểu Rust và SDL. Hướng dẫn này hơi cũ hơn và thư viện SDL đã thay đổi kể từ khi nó được viết, vì vậy tôi đang theo dõi trong khi cũng thích nghi nó với phiên bản mới nhất của Rust-SDL.Không thể suy ra tuổi thọ thích hợp cho autoref do các yêu cầu xung đột
vấn đềThời gian tồn tại là trong hàm này:
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)
})
}
đặc biệt là với dòng self.ttf_context.load_font(Path::new(font_path), size as u16).ok()
. Dòng nhận xét ở trên là phương thức tải phông chữ của phiên bản SDL cũ.
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>
Đối tượng struct để thực hiện trông như thế này:
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>>
}
Phương pháp này đang cố gắng tải một phông chữ từ Phi của ttf_context
và tải nó vào hashmap. Trình biên dịch Rust đề nghị tôi thêm một đời vào self
trong các tham số chức năng, khi tôi làm điều đó, gây ra hiệu ứng xếp tầng để tăng thêm thời gian sống cho mọi phương thức gọi là nguyên bản, xuống đến main()
và không giúp gì cả.
Vì tôi vẫn còn mới với Rust, tôi không chắc nơi xung đột cuộc đời cư trú hoặc lý do điều này xảy ra. Theo dự đoán, tôi nghĩ rằng đối tượng Font
đang được tạo ra được cho là sẽ chết khi kết thúc phương thức đó, nhưng thay vào đó nó được nạp vào một hashmap với tuổi thọ là 'window
và hai xung đột đó. Tuy nhiên, tôi không biết đủ về Rust để khắc phục điều đó, hoặc nếu điều đó đúng.
Tôi đã làm việc với sự giúp đỡ của bạn! Cảm ơn! –
__FontLoader (và do đó Phông chữ) không đủ dài.__: Không phải là thời gian tồn tại của 'FontLoader' giống như Phi có chứa nó? –
@CarlLevasseur có, thời gian tồn tại của 'FontLoader' và' chứa 'Phi' của nó giống nhau. Tại sao bạn hỏi? – Shepmaster