How to convert from &[u8] to Vec?

2020-02-10 17:33发布

I'm attempting to simply convert a slice to a vector. The following code:

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

fails with the following error message:

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`

What am I missing?

标签: rust
2条回答
爱情/是我丢掉的垃圾
2楼-- · 2020-02-10 17:48

Collecting into a Vec is so common that slices have a method to_vec that does exactly this:

let b = a.to_vec();

You get the same thing as CodesInChaos's answer, but more concisely.

Notice that to_vec requires T: Clone. To get a Vec<T> out of a &[T] you have to be able to get an owned T out of a non-owning &T, which is what Clone does.

Slices also implement ToOwned, so you can use to_owned instead of to_vec if you want to be generic over different types of non-owning container. If your code only works with slices, prefer to_vec instead.

查看更多
看我几分像从前
3楼-- · 2020-02-10 17:59

The iterator only returns references to the elements (here &u8). To get owned values (here u8), you can used .cloned().

let a: &[u8] = &[0u8];
let b: Vec<u8> = a.iter().cloned().collect();
查看更多
登录 后发表回答