我如何找出命名生命周期的来源?

How do I figure out where a named lifetime comes from?

我正在阅读 the code of rust-sdl2 并且有这个 Texture 结构:

pub struct Texture<'r> {
    raw: *mut sys::SDL_Texture,
    _marker: PhantomData<&'r ()>,
}

我如何知道 'r 生命周期从何而来?

如果这样声明结构,那么 Rust 将能够自动确保内存安全:

pub struct Texture<'r> {
    raw: &'r mut sys::SDL_Texture,
}

由于 SDL_Texture 是在 Rust 代码之外管理的,因此这是不可能的,因为需要原始指针。 Texture 的生命周期是为了在不安全的数据结构周围添加内存安全的抽象。

板条箱管理 Texture 的创建,并确保生命周期始终为 "correct"。生命周期是为了确保纹理不会超过内部 SDL_Texture,它只被原始指针引用。

您不能自己创建 Texture,除非使用不安全的函数。如果您要致电 TextureCreator::raw_create_texture,您必须自己满足这一生的所有要求。而是safe方法create_texture构造一个Texture,同时保证内存安全

create_texture 的类型签名是:

pub fn create_texture<F>(
    &self,
    format: F,
    access: TextureAccess,
    width: u32,
    height: u32,
) -> Result<Texture, TextureValueError>
where
    F: Into<Option<PixelFormatEnum>>,

省略了一些生命周期。根据 Rust 的 lifetime elision rules,这可以更明确地写为:

pub fn create_texture<'r, F>(
    &'r self,
    format: F,
    access: TextureAccess,
    width: u32,
    height: u32,
) -> Result<Texture<'r>, TextureValueError>
where
    F: Into<Option<PixelFormatEnum>>,

生命周期注释表达了 selfTexture 之间的引用依赖关系。因此,返回的 Texture 不允许超过 TextureCreator.