所以我正在用 rust 构建一个游戏引擎,但是我在找到正确的生命周期参数/语法来存储 sdl2 库渲染所需的字体数据时遇到了问题。
这是我目前正在做的简化版本,但它不能编译。据我所知,由Font
给出的对象的第一个生命周期参数ttf.load_font()
必须与ttf
对象本身的生命周期相匹配,但我无法提出正确的语法或数据结构来告诉编译器该生命周期关系。
我目前的理解是,作为数据成员,它ttf
具有相同(或更短)的生命周期,并且创建的任何对象都将具有与创建它的对象相关联的生命周期。所以in FontManager 应该是相同的生命周期。显然我在这里缺少一些东西,因为它不太有效,但我不确定它是什么。如果有人可以帮助解释发生了什么,我将不胜感激。FontManager
Font
ttf
<'a>
mod sdl2;
struct FontManager<'a> {
pub ttf: sdl2::ttf::Sdl2TtfContext,
pub font: Option<sdl2::ttf::Font<'a, 'static>>,
}
impl<'a> FontManager<'a> {
pub fn load_font(&'a mut self, path: &std::path::Path, size: usize) {
match self.ttf.load_font(&self.ttf, path, size as u16) {
Err(e) => panic!("{:?}", e),
Ok(font) => { self.font = Some(font); }
}
}
}
fn main() -> Result<(), String> {
let ttf = sdl2::ttf::init().map_err(|e| e.to_string())?;
let mut fm = FontManager { ttf, font: None };
fm.load_font(std::path::Path::new("Arial.ttf", 16); // <- error: 'fm' does not live long enough
// ...main game loop...
} // <- error: 'fm' dropped here while still borrowed