Я хотел бы скопировать один Vec
в другой, в чанках из [u8; 4]
, назначив первый элемент 3 только для каждого чанка (оставив только 4-й). Это похоже на практический способ go об этом:
let input_pix: Vec<u8> = ...;
let mut output_pix: Vec<u8> = vec![255; input_pix.len()];
for (input_chunk, output_chunk) in input_pix.chunks(4).zip(output_pix.chunks_exact_mut(4)) {
let i: u8 = foo(...);
output_chunk[0..2].clone_from_slice([i,3]);
}
... НО компилятору это не нравится. На самом деле нарезка output_chunk
вообще выдает ошибку. Проще всего:
...
for (input_chunk, output_chunk) in input_pix.chunks(4).zip(output_pix.chunks_exact_mut(4)) {
let s = format!("{:?}", output_chunk[0..2]);
}
В результате ...
|
40 | let s = format!("{:?}", output_chunk[0..2]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
Из документов:
Чанки являются кусочками и не перекрываются. Если chunk_size не делит длину среза, то последние до элементов chunk_size-1 будут опущены и могут быть извлечены из функции остатка итератора.
Из-за того, что каждый блок имеет точно элементы chunk_size, компилятор часто может оптимизировать полученный код лучше, чем в случае кусков.
Итак ... похоже, он говорит о размере элементов ChunksExactMut
(возвращено из chunks_exact_mut
) является точным и в этом случае 4 , так что дает? Зная размер во время компиляции, вы чувствуете, как будто это точка из ChunksExactMut
.
Я поступаю неправильно? Есть ли еще какой-то идиоматический c способ скопировать в кусочек ChunksExactMut
. Я могу просто скопировать элемент с помощью al oop, но это кажется очень вонючим. Или, может быть, IS способ сделать это, и я должен позволить компилятору сделать работу?