我正在阅读rust-sdl2 的代码,并且有这个Texture
结构:
pub struct Texture<'r> {
raw: *mut sys::SDL_Texture,
_marker: PhantomData<&'r ()>,
}
我怎么知道'r
生命从何而来?
我正在阅读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
是为了在不安全的数据结构周围添加一个内存安全的抽象。
crate 管理Texture
s 的创建,并确保生命周期始终是“正确的”。生命周期的存在是为了确保纹理不会超过 inner SDL_Texture
,它仅由原始指针引用。
你不能自己创建Texture
,除非使用不安全的函数。如果你要打电话TextureCreator::raw_create_texture
,你必须自己满足这一生的所有要求。相反,safe方法create_texture
构造 a 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 的生命周期省略规则,这可以更明确地写成:
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>>,
生命周期注释表示self
和之间的引用依赖关系Texture
。因此,返回Texture
的人不得超过TextureCreator
.