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の試み(遊び場の例):
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
一度に複数回ミュータブルとして借用することはできません