Rust 由于需求冲突,无法推断自动引用的适当生存期
我的代码中的某个特定函数存在生命周期问题。我正在学习一个教程,试图学习Rust和SDL。本教程稍旧一些,SDL库自编写以来已经发生了更改,因此我将继续学习,同时也将其改编为Rust SDL的最新版本 此函数存在生命周期问题: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> {
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由于生存期可以防止编译不正确的代码,因此需要使用原始指针来演示该问题。请注意,指针现在指向无效位置。