如何迭代 itertools::chunks

avs*_*hyz 6 rust

我是一个新的 rustacean,所以我的代码质量值得怀疑。在尝试获取生锈的绳索时,我遇到了以下问题。

我有一个位向量 ( bools ),我想将其转换为字节向量 ( 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);
Run Code Online (Sandbox Code Playgroud)

它有效,但感觉很丑陋,所以我尝试使用板条箱 itertools 来实现它。

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

它确实看起来更好,但遗憾的是 - 它不起作用。

尽管看起来 ifchunks的返回类型似乎是一个迭代器,但这一行产生了以下错误

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

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

Nou*_*tes 9

我相信您误读了这里的文档。适合您的部分就在这里。你会在哪里看到(强调我的):

返回一个可以对迭代器进行分块的可迭代对象。

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

因此,您需要into_itermap.