Если структура была объявлена следующим образом, Rust сможет автоматически обеспечить безопасность памяти:
pub struct Texture<'r> {
raw: &'r mut sys::SDL_Texture,
}
Поскольку управление SDL_Texture
осуществляется вне кода Rust, это невозможно, так как необработанный указатель нужен. Время жизни на Texture
позволяет добавить безопасную для памяти абстракцию вокруг небезопасной структуры данных.
Ящик управляет созданием Texture
с и гарантирует, что время жизни всегда "правильное". Время жизни существует, чтобы гарантировать, что текстура не переживет внутренний SDL_Texture
, на который ссылается только необработанный указатель.
Вы не можете создать Texture
самостоятельно, кроме как с помощью небезопасных функций. Если бы вы позвонили TextureCreator::raw_create_texture
, вы бы сами выполнили все требования на этот срок. Вместо этого безопасный метод 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>>,
Some жизни исключены. Согласно правилам жизненного разрешения 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>>,
аннотации времени жизни express ссылочная зависимость между self
и Texture
. Поэтому возвращенный Texture
не может пережить TextureCreator
.