Я новый руст, поэтому качество моего кода сомнительно.При попытке получить веревки ржавчины я столкнулся со следующей проблемой:
У меня есть вектор битов (bool
с), и я хочу преобразовать его в вектор байтов (u8
)
Моя первая реализация выглядела так
let mut res: Vec<u8> = vec![];
let mut curr = 0;
for (idx, &bit) in bits.iter().enumerate() {
let x = (idx % 8) as u8;
if idx % 8 != 0 || idx == 0 {
curr = set_bit_at(curr, (7 - (idx % 8)) as u32, bit).unwrap();
} else {
res.push(curr);
curr = 0
}
}
res.push(curr);
Она работала, но выглядела довольно уродливо, поэтому я попытался реализовать ее с помощью itertools crate.
let res = bits.iter()
.chunks(8)
.map(|split_byte: Vec<u8>| {
split_byte.fold(0, |res, &bit| (res << 1) | (bit as u8))
})
.collect();
Конечно, выглядит лучше, но, к сожалению, это не сработало.
Даже если кажется, что chunks
тип возвращаемого значения кажется итератором,эта строка выдает следующую ошибку
error[E0599]: no method named `map` found for type `bits::itertools::IntoChunks<std::slice::Iter<'_, bool>>` in the current scope
Может кто-нибудь сказать, что я сделал не так?