我试图简单地将切片转换为矢量。以下代码:
let a = &[0u8];
let b: Vec<u8> = a.iter().collect();
失败,并显示以下错误消息:
3 | let b: Vec<u8> = a.iter().collect();
| ^^^^^^^ a collection of type `std::vec::Vec<u8>` cannot be built from an iterator over elements of type `&u8`
我错过了什么?
答案 0 :(得分:12)
收集到Vec
非常常见,切片的方法to_vec
就是这样做的:
let b = a.to_vec();
你得到与CodesInChaos's answer相同的东西,但更简洁。
请注意to_vec
需要T: Clone
。要从Vec<T>
中获得&[T]
,您必须能够从非拥有T
中获取拥有的&T
,这就是Clone
确实
Slices also implement ToOwned
,因此如果您希望对不同类型的非拥有容器具有通用性,则可以使用to_owned
代替to_vec
。如果您的代码仅适用于切片,请更喜欢to_vec
。
答案 1 :(得分:1)
迭代器只返回对元素的引用(这里是&u8
)。要获取自有值(此处为u8
),您可以使用.cloned()
。
let a: &[u8] = &[0u8];
let b: Vec<u8> = a.iter().cloned().collect();