Ziva
Ziva

Reputation: 3501

How to concatenate the individual elements of a vector of slices with other slices?

I have a slice of bytes start = [30u8; 5] and middle = [40u8; 3] and a vector of byte slices:

let first = [1u8; 10];
let second = [2u8; 10];
let third = [3u8; 10];

let elements: Vec<[u8; 10]> = vec![first, second, third]; 

I want to concatenate everything together, in such a way that I will obtain a single byte slice which looks as

[30, 30, 30, 30, 30, 40, 40, 40, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3]

However, although I can concatenate start and middle when I try to append the vector elements it fails. I know that I am wrongly trying to iterate through the elements of the vector to concatenate, but I can't figure out how to do it correctly?

fn main() {
    let start = [30u8; 5];
    let middle = [40u8; 4];
    let first = [1u8; 10];
    let second = [2u8; 10];
    let third = [3u8; 10];

    let elements: Vec<[u8; 10]> = vec![first, second, third];
    println!("{:?}", elements.iter());

    for key in elements.iter() {
        println!("{:?}", key.iter());
    }

    let alltogether: Vec<u8> = start
        .iter()
        .cloned()
        .chain(middle.iter().cloned())
        .chain(elements.iter().iter().cloned())
        .collect();

    println!("{:?}", alltogether);
}

This example can be copy-pasted into the Rust playground.

Upvotes: 0

Views: 782

Answers (1)

phimuemue
phimuemue

Reputation: 35983

You possibly want this:

    let alltogether: Vec<u8> = start
        .iter()
        .cloned()
        .chain(middle.iter().cloned())
        .chain(elements.iter().flatten().cloned())
        .collect();

Note that there is also copied (instead of cloned) that can be used for Copyable types.

If the stuff in elements does not implement IntoIterator itself, you can use flat_map to specify how to convert one element to an iterator.

Upvotes: 1

Related Questions