Как объединить отдельные элементы вектора срезов с другими срезами? - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть кусочек байтов start = [30u8; 5] и middle = [40u8; 3] и вектор кусочков байтов:

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

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

Я хочу объединить все вместе, таким образом, чтобы я получил один байт срез, который выглядит как

[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]

Однако, хотя я могу объединить start и middle, когда я пытаюсь добавить вектор elements, он терпит неудачу. Я знаю, что ошибочно пытаюсь перебрать элементы вектора для объединения, но я не могу понять, как это сделать правильно?

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);
}

Этот пример можно скопировать на игровую площадку Rust.

1 Ответ

1 голос
/ 08 апреля 2020

Возможно, вы захотите это :

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

Обратите внимание, что есть также copied (вместо cloned), который можно использовать для Copy способных типов.

Если материал в elements не реализует сам IntoIterator, вы можете использовать flat_map, чтобы указать, как преобразовать один элемент в итератор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...