所以我有一个刚刚创建的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()
,后者要求a
和b
是相同的类型,而不是简单地作为迭代器产生相同的类型。
由于a.iter().copied()
和b.iter().flat_map(...)
不是同一类型,因此必须使用.chain
而不是数组。