Rust 如何解决SDL2的锈蚀寿命限制问题?

Rust 如何解决SDL2的锈蚀寿命限制问题?,rust,sdl-2,Rust,Sdl 2,我正在尝试使用sdl2 ttf呈现一些字体。sdl2中的字体类型对使用PhantomData的上下文具有生存期依赖性。我发现它很难使用。下面是我尝试使用的最小代码 梅因 extern crate sdl2; use sdl2::ttf::{self, Font}; use sdl2::ttf::Sdl2TtfContext; struct App<'ttf> { ctx: Sdl2TtfContext, glyph_renderer: GlyphRenderer&

我正在尝试使用sdl2 ttf呈现一些字体。sdl2中的字体类型对使用PhantomData的上下文具有生存期依赖性。我发现它很难使用。下面是我尝试使用的最小代码

梅因

extern crate sdl2;

use sdl2::ttf::{self, Font};
use sdl2::ttf::Sdl2TtfContext;

struct App<'ttf> {
    ctx: Sdl2TtfContext,
    glyph_renderer: GlyphRenderer<'ttf>,
}

impl<'ttf> App<'ttf> {
    fn render(&self) {}
}

struct GlyphRenderer<'ttf> {
    font: Font<'ttf, 'static>,
}

fn main() {
    let ttf_context = ttf::init().unwrap();

    let font = ttf_context.load_font("./assets/Supermercado-Regular.ttf", 50).unwrap();
    let glyph_renderer = GlyphRenderer { font };

    let app = App {
        ctx: ttf_context,
        glyph_renderer,
    };

    app.render();
}
  • ttf_上下文被移动。我可以解决这个问题,但是通过以一种丑陋的方式更改代码
  • 字体在上下文上具有生存期限制。无法修复这个

  • 本文档包含
    Sdl2TtfContext
    Font
    的声明,如果您觉得有用的话

    好的,我可以通过将上下文创建移动到外部范围来解决这个问题。它不能放在结构上

    fn start(ttf_context: &Sdl2TtfContext) {
        let font = ttf_context.load_font("./assets/Supermercado-Regular.ttf", 50).unwrap();
        let glyph_renderer = GlyphRenderer { font };
    
        let app = App {
            glyph_renderer,
        };
    
        app.render();
    }
    
    fn main() {
        let ttf_context = ttf::init().unwrap();
        start(&ttf_context);
    }
    

    寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:。Tim,我更新了代码。现在它包含了一个最短的代码示例。您可以添加错误输出吗?
    fn start(ttf_context: &Sdl2TtfContext) {
        let font = ttf_context.load_font("./assets/Supermercado-Regular.ttf", 50).unwrap();
        let glyph_renderer = GlyphRenderer { font };
    
        let app = App {
            glyph_renderer,
        };
    
        app.render();
    }
    
    fn main() {
        let ttf_context = ttf::init().unwrap();
        start(&ttf_context);
    }