41

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?

  • `u8` != `&u8`. Possible duplicate of https://stackoverflow.com/questions/24689463/collect-into-owned-vec-of-owned-strings-in-rust, but the syntax changed a little bit since then. – Stefan Dec 26 '17 at 14:46
  • @Stefan What does `u8` have to do with strings? –  Dec 26 '17 at 14:55
  • let a = &[0u8]; let b: Vec = a.iter().collect(); @Roxy , I tried this and it does work for me. If we make the genric as &u8 for b:Vec. – Ranjith Raj D Dec 26 '17 at 15:25

2 Answers2

70

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.

trent
  • 21,712
  • 7
  • 47
  • 79
  • I actually needed to do something more complicated and unfortunately `to_vec` didn't work. The error I get is: `error[E0599]: no method named to_vec found for type std::iter::Take>> in the current scope` –  Dec 27 '17 at 21:15
  • 1
    @Roxy That's a different question: "how do I convert an iterator to a `Vec`?" `.collect()` is definitely the right answer to that one. – trent Dec 28 '17 at 01:16
16

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();
CodesInChaos
  • 103,479
  • 23
  • 206
  • 257