如何转换&[u8]至Vec <u8>?

11 rust

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

let a = &[0u8];
let b: Vec<u8> = a.iter().collect();
Run Code Online (Sandbox Code Playgroud)

失败,出现以下错误消息:

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`
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

tre*_*tcl 20

收集到一个Vec非常常见的切片有一个方法to_vec,正是这样做:

let b = a.to_vec();
Run Code Online (Sandbox Code Playgroud)

你得到了与CodesInChaos的答案相同的东西,但更简洁.

请注意,to_vec需要T: Clone.为了摆脱Vec<T>困境,&[T]你必须能够拥有T一个非拥有者&T,这是什么Clone.

切片也可以实现ToOwned,因此您可以使用to_owned而不是to_vec如果您希望对不同类型的非拥有容器具有通用性.如果您的代码仅适用于切片,请选择to_vec.


Cod*_*aos 10

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

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