我是一名新的锈菌,所以我的代码质量值得怀疑。 在试图除锈时,我遇到了以下问题。
我有一个位向量(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
谁能告诉我我做错了什么?
答案 0 :(得分:1)
我相信您在这里误读了文档。适合您的部分是here。您会在哪里看到(重点是我):
返回可以对迭代器进行分块的 iterable 。
IntoChunks基于GroupBy:可迭代(实现) IntoIterator,而不是Iterator ),并且仅在有多个块时才进行缓冲 迭代器同时处于活动状态。
因此,您需要在into_iter
之前使用map
。