arrays - 如何将两个 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>
.
我也觉得它应该比我的例子更简单。好像我错过了一个特定的功能。
解决方案
以下作品:
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()
,它需要a
和b
是相同的类型,而不是简单地作为产生相同类型的迭代器。
由于a.iter().copied()
和b.iter().flat_map(...)
不是同一类型,您必须使用.chain
而不是数组。
推荐阅读
- python - 从 django 1.1 升级到 2.2,-(错误)post_detail_view() 得到了一个意外的关键字参数 'day'
- typescript - TypeScript 错误 TS2345 是否有 eslint 规则
- html - Safari 和 iOS 中的标题问题
- sql-server - SQL Server 等待类型
- c# - 地址已经在使用 Unity Android
- jenkins - 来自 YAML 文件的 Jenkins 管道
- python - 从两个数据框中剪切和粘贴值以获取匹配值
- python - 为什么调用方法时会出现 AttributeError?
- amazon-web-services - Jenkins 本地与云(AWS)
- vowpalwabbit - Vowpal Wabbit:关于在历史数据上训练上下文强盗的问题