Как перебрать itertools :: chunks - PullRequest
1 голос
/ 09 мая 2019

Я новый руст, поэтому качество моего кода сомнительно.При попытке получить веревки ржавчины я столкнулся со следующей проблемой:

У меня есть вектор битов (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

Может кто-нибудь сказать, что я сделал не так?

1 Ответ

1 голос
/ 09 мая 2019

Я полагаю, вы неправильно прочитали документ здесь. Правильная часть для вас - здесь . Где вы это увидите (выделено мое):

Возвращает итерируемый , который может разделить итератор на части.

IntoChunks основан на GroupBy: это итеративно (реализует IntoIterator, а не Iterator) , и он буферизуется только в случае нескольких блоков итераторы живы одновременно.

Следовательно, вам нужно использовать into_iter перед вашим map.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...