如何将u8和u16元素的两个数组合并为u8元素的数组



所以我有一个刚刚创建的u8(a(数组和一个u16(b(切片。在将a的元素与b的元素转换为u8之后,我如何获得一个数组?

我尝试过对下面的代码进行很多修改,但总是有一些错误。

fn main() {
let a: [u8; 3] = [0x01, 0x02, 0x03];
let b: &[u16] = &[0x0405, 0x0607, 0x0809];
let result = [a,
b.iter().flat_map(|s| &s.to_be_bytes()).collect()]
.iter().flat_map(|e| e.iter()).collect();
assert_eq!(result, [1, 2, 3, 4, 5, 6, 7, 8, 9]);
}

我理解这段代码中的错误,但我不知道如何在不创建另一个代码的情况下修复它。

比如,我可以将a创建为Vec<u8>,这样collect()就可以收集到实现std::iter::FromIterator的东西中。但它收集到CCD_ 9中。

我也觉得它应该比我的例子简单得多。好像我错过了一个特定的功能。

以下作品:

fn main() {
let a: [u8; 3] = [0x01, 0x02, 0x03];
let b: &[u16] = &[0x0405, 0x0607, 0x0809];
let result: Vec<u8> = a.iter().copied()
.chain(
b.iter()
.flat_map(|s| std::array::IntoIter::new(s.to_be_bytes()))
)
.collect();
assert_eq!(result, [1, 2, 3, 4, 5, 6, 7, 8, 9]);
}

这使用了新添加的std::array::IntoIter,它将数组[T; N]转换为类型为T的迭代器,而不是生成&T.iter()。这解决了将CCD_ 15与CCD_。

然后,它使用.chain将两个迭代器连接在一起,这允许我们使用不同类型的迭代器来产生相同的项,而不是使用[a, b].iter(),后者要求ab是相同的类型,而不是简单地作为迭代器产生相同的类型。

由于a.iter().copied()b.iter().flat_map(...)不是同一类型,因此必须使用.chain而不是数组。

最新更新