首页 > 解决方案 > 如何将两个 u8 和 u16 元素数组合并为一个 u8 元素数组?

问题描述

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

我已经尝试了对以下代码的大量修改,但总是有一些错误。

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。但它收集到Vec<&u8>.

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

标签: arraysrust

解决方案


以下作品:

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,而不是.iter()which 产生&T。这解决了将 au8与 a组合的问题&u8

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

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


推荐阅读