0

所以我正在用 rust 构建一个游戏引擎,但是我在找到正确的生命周期参数/语法来存储 sdl2 库渲染所需的字体数据时遇到了问题。

这是我目前正在做的简化版本,但它不能编译。据我所知,由Font给出的对象的第一个生命周期参数ttf.load_font()必须与ttf对象本身的生命周期相匹配,但我无法提出正确的语法或数据结构来告诉编译器该生命周期关系。

我目前的理解是,作为数据成员,它ttf具有相同(或更短)的生命周期,并且创建的任何对象都将具有与创建它的对象相关联的生命周期。所以in FontManager 应该是相同的生命周期。显然我在这里缺少一些东西,因为它不太有效,但我不确定它是什么。如果有人可以帮助解释发生了什么,我将不胜感激。FontManagerFontttf<'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
4

0 回答 0