如何转换&[u8]至Vec ?

问题描述 投票:5回答:2

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

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`

我错过了什么?

rust
2个回答
1
投票

迭代器只返回对元素的引用(这里是&u8)。要获得自有值(此处为u8),您可以使用.cloned()

let a: &[u8] = &[0u8];
let b: Vec<u8> = a.iter().cloned().collect();

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

© www.soinside.com 2019 - 2024. All rights reserved.