我知道 Rust 不支持可变长度数组,但这让我想知道用什么替换它们,因为:
- 我不想在循环中分配和释放一个小的 Vec
- 借用检查器不允许我将代码移出循环
- 固定大小的数组有很多限制,所以我不知道如何使用它们
我正在转换的 C 代码通过在每一行上调用回调来处理图像,并传递一个小的指针数组:
float *tmp[img->channels]; // Small, up to 4 elements
for(int y = 0; y < height; y++) {
for(int ch = 0; ch < img->channels; ch++) {
tmp[ch] = &img->channel[ch]->pixels[width * y];
}
callback(tmp, img->channels);
}
我的 Rust 尝试(在 playpen 中的示例):
for y in 0..height {
let tmp = &img.channel.iter().map(|channel| {
&mut channel.pixels.as_ref().unwrap()[width * y .. width * (y+1)]
}).collect();
callback(tmp);
}
但它被拒绝了:
[&mut [f32]]
不能从类型元素的迭代器构建类型集合&mut [f32]
可悲的是,这听起来和我想要做的完全一样!
我尝试过使用固定大小的数组,但 Rust 不支持它们的泛型,所以我不能从迭代器中填充它,也不能在类似 C 的循环中填充它们,因为引用被引入循环不会超过它。
该特征
core::iter::FromIterator<&mut [f32]>
未针对该类型实现[&mut [f32]; 4]
从固定大小的数组中获取内存片的另一种方法也失败了:
let mut row_tmp: [&mut [f32]; 4] = unsafe{mem::zeroed()};
for y in 0..height {
row_tmp[0..channels].iter_mut().zip(img.chan.iter_mut()).map(|(t, chan)| {
*t = &mut chan.img.as_ref().unwrap()[(width * y) as usize .. (width * (y+1)) as usize]
});
cb(&row_tmp[0..channels], y, width, image_data);
}
错误:一次不能多次借用
img.chan
mutable