How do I concatenate two slices in Rust

De openkb
Aller à : Navigation, rechercher

Sommaire

Questions

I want to take the x first and last elements from a vector and concatenate them. I have the following code:

fn main() {
    let v = (0u64 .. 10).collect::<Vec<_>>();
    let l = v.len();
    vec![v.iter().take(3), v.iter().skip(l-3)];
}

This gives me the error

error[E0308]: mismatched types
 --> <anon>:4:28
  |
4 |     vec![v.iter().take(3), v.iter().skip(l-3)];
  |                            ^^^^^^^^^^^^^^^^^^ expected struct `std::iter::Take`, found struct `std::iter::Skip`
<anon>:4:5: 4:48 note: in this expansion of vec! (defined in <std macros>)
  |
  = note: expected type `std::iter::Take<std::slice::Iter< _, u64>>`
  = note:    found type `std::iter::Skip<std::slice::Iter< _, u64>>`

How do I get my vec of 1, 2, 3, 8, 9, 10? I am using Rust 1.12.

Answers

You should collect() the results of the take() and extend() them with the collect()ed results of skip():

let mut p1 = v.iter().take(3).collect::<Vec<_>>();
let p2 = v.iter().skip(l-3);

p1.extend(p2);

println!("{:?}", p1);
  Edit   : as Neikos said, you don t even need to collect the result of skip(), since extend() accepts arguments implementing IntoIterator (which Skip does, as it is an Iterator).
  Edit 2   : your numbers are a bit off, though; in order to get 1, 2, 3, 8, 9, 10 you should declare v as follows:
let v = (1u64 .. 11).collect::<Vec<_>>();

https://doc.rust-lang.org/stable/std/ops/struct.Range.html https://doc.rust-lang.org/stable/std/ops/struct.Range.html

Source

License : cc by-sa 3.0

http://stackoverflow.com/questions/40154150/how-do-i-concatenate-two-slices-in-rust

Related

Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Outils