如何遍历itertools :: chunks

时间:2019-05-09 17:27:27

标签: rust

我是一名新的锈菌,所以我的代码质量值得怀疑。 在试图除锈时,我遇到了以下问题。

我有一个位向量(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来实现它。

let res = bits.iter()
    .chunks(8)
    .map(|split_byte: Vec<u8>| {
        split_byte.fold(0, |res, &bit| (res << 1) | (bit as u8))
    })
    .collect();

看起来确实更好,但可悲的是-它没有用。

即使chunks的返回类型seems似乎是迭代器,此行也会产生以下错误

error[E0599]: no method named `map` found for type `bits::itertools::IntoChunks<std::slice::Iter<'_, bool>>` in the current scope

谁能告诉我我做错了什么?

1 个答案:

答案 0 :(得分:1)

我相信您在这里误读了文档。适合您的部分是here。您会在哪里看到(重点是我):

  

返回可以对迭代器进行分块的 iterable

     

IntoChunks基于GroupBy:可迭代(实现)    IntoIterator,而不是Iterator ),并且仅在有多个块时才进行缓冲   迭代器同时处于活动状态。

因此,您需要在into_iter之前使用map