Image.rs文件定义了一个名为 Image 的结构体,用于表示图像数据。源码如下:
#[derive(Clone, Copy)]
pub struct Image<'a> {
pub width: i32,
pub height: i32,
pub data: &'a [u32],
}
让我们逐步分析它的各个部分:
- 属性宏 #[derive(Clone, Copy)]
这个属性自动为 Image 结构体实现了 Clone 和 Copy trait
Clone 允许通过 .clone() 方法创建副本
Copy 表示类型可以通过简单的内存复制来复制(而不是移动语义)
由于结构体包含一个引用字段 data,只有当引用的生命周期 'a 允许时,才能安全地实现这些 trait
- 结构体字段
pub width: i32 - 公开的32位整数,表示图像的宽度(像素数)
pub height: i32 - 公开的32位整数,表示图像的高度(像素数)
pub data: &'a [u32] - 公开的对 u32 数组的引用,存储图像的像素数据
- 生命周期参数 'a
这个结构体包含一个引用字段 data,因此需要一个生命周期参数
'a 表示引用的数据必须至少与 Image 实例存活一样长
这确保了 Image 实例不会比它引用的像素数据存活更久,防止悬垂引用
使用场景
这个结构体适合表示借用的图像数据:
轻量级,因为只包含宽度、高度和一个引用
可以高效传递,因为实现了 Copy
适用于图像数据由其他部分拥有,而 Image 只是临时引用的场景
示例用法
fn main() {
let pixel_data = vec![0u32; 1024]; // 32x32 图像的像素数据
// 创建一个 Image 引用现有的像素数据
let image = Image {
width: 32,
height: 32,
data: &pixel_data,
};
// 由于实现了 Copy,可以自由复制
let image_copy = image;
// 两个变量都可以使用
println!("Original: {}x{}", image.width, image.height);
println!("Copy: {}x{}", image_copy.width, image_copy.height);
}
限制
由于使用引用,Image 不能比其 data 字段引用的数据存活更久
像素数据必须是 u32 数组,每个像素用32位无符号整数表示
结构体本身不拥有数据,只是借用,所以需要确保底层数据在需要时可用
如果需要拥有数据的版本,可以考虑使用 Vec 。目前仅考虑引用。