Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 由于需求冲突,无法推断自动引用的适当生存期_Rust_Sdl_Lifetime - Fatal编程技术网

Rust 由于需求冲突,无法推断自动引用的适当生存期

Rust 由于需求冲突,无法推断自动引用的适当生存期,rust,sdl,lifetime,Rust,Sdl,Lifetime,我的代码中的某个特定函数存在生命周期问题。我正在学习一个教程,试图学习Rust和SDL。本教程稍旧一些,SDL库自编写以来已经发生了更改,因此我将继续学习,同时也将其改编为Rust SDL的最新版本 此函数存在生命周期问题: pub fn ttf_str_sprite(&mut self, text: &str, font_path: &'static str, size: i32, color: Color) -> Option<Sprite> {

我的代码中的某个特定函数存在生命周期问题。我正在学习一个教程,试图学习Rust和SDL。本教程稍旧一些,SDL库自编写以来已经发生了更改,因此我将继续学习,同时也将其改编为Rust SDL的最新版本

此函数存在生命周期问题:

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)
    })
}
该实现的结构对象如下所示:

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>>
}
pub结构Phi,
发布ttf_上下文:Sdl2TtfContext,
缓存的字体:HashMap>
}
该方法试图从Phi的
ttf_上下文中加载字体,并将其加载到hashmap中。Rust编译器建议我在函数参数中的
self
中添加一个生存期,当我这样做时,会对每个调用原始方法的方法添加生存期产生级联效应,一直到
main()
,并且没有任何帮助


因为我还是个新手,所以我不确定终身冲突在哪里,也不知道为什么会发生。作为猜测,我认为正在生成的
Font
对象应该随着该方法的结束而消亡,但相反,它被加载到一个hashmap中,其生存期为
'window
,这两个冲突。不过,我对锈病的了解还不够,无法解决这个问题,或者这是否正确。

这里有一个小例子再现了这个问题:

struct-FontLoader(字符串);
结构字体{
字体(&self.0)
}
}
结构窗口;
结构Phi Phi src/main.rs:18:6
|
18 | impl{
|      ^^^^^^^
注意:…因此表达式是可赋值的
-->src/main.rs:21:21
|
21 | self.font=一些(字体);
|                     ^^^^^^^^^^
=注意:预期的`选项>`
问题确实在于您构建了一个不可能的案例。具体而言,代码说明了以下几点:

  • Phi
    将包括对
    窗口的引用,该窗口引用了生命周期
    窗口的值寿命

  • Phi
    将包含一个
    Font
    ,其中包含一个引用。该引用引用了生命周期
    窗口的值寿命

  • FontLoader
    返回一个
    Font
    ,其中包含对加载程序的生存期为的值的引用。这是由于生存期推断造成的,它在展开时如下所示:

    impl-FontLoader{
    fn加载字体>,
    }
    impl-Phi{
    fn做事情(&'font mut self){
    让font=self.loader.load();
    self.font=Some(字体);
    }
    }
    
    这实际上会编译,但可能不会执行您想要的操作。有关更多信息,请参阅

    更可能的情况是,您希望引用字体加载程序:

    struct Phi>,
    }
    恳求{
    fn做自己的事(&mut self){
    让font=self.loader.load();
    self.font=Some(字体);
    }
    }
    

    在这里,我重新命名了生命周期,因为它不再严格适用于窗口。

    FontLoader(因此字体)的寿命不够长:
    FontLoader
    的生命周期不是与包含它的Phi相同吗?@Carllevasser是的,
    FontLoader
    的生命周期及其包含的
    Phi
    是相同的。你为什么要问?这不意味着它有
    ”窗口
    生存期吗?如果它的寿命与
    Phi
    对象相同,因此与
    Phi.font
    相同,我不理解它为什么活得不够长?在什么情况下,字体加载器在
    '窗口
    生命周期结束之前是空闲的?@carllevasser在什么情况下,字体加载器在
    '窗口
    生命周期结束之前是空闲的?我相信在每种情况下。这不意味着它有
    '窗口
    生存期-否。它包含一个引用,该引用有
    窗口
    生存期,但它本身有一个不同的生存期。@MarioIshac由于生存期可以防止编译不正确的代码,因此需要使用原始指针来演示该问题。请注意,指针现在指向无效位置。