如何将&amp; [u8]转换为Vec <u8>?

时间:2017-12-26 14:36:55

标签: rust

我试图简单地将切片转换为矢量。以下代码:

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`

我错过了什么?

2 个答案:

答案 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();