Как перебрать несколько опционных векторов в Rust? - PullRequest
1 голос
/ 29 марта 2020

У меня есть несколько ссылок на векторы опций над Rc указателями на объекты, и я бы хотел перебрать все их элементы.

По сути, объявление этих векторов выглядит так:

let vec_0: Option<&Vec<Rc<TraitObject>>> = ...;
let vec_1: Option<&Vec<Rc<TraitObject>>> = ...;
...
let vec_n: Option<&Vec<Rc<TraitObject>>> = ...;

Я пытался использовать метод chain() следующим образом:

let it = vec_o.unwrap_or(&vec![]).iter()
    .chain(vec_1.unwrap_or(&vec![]))
    ...
    .chain(vec_n.unwrap_or(&vec![]));

for el in it {
    ...
}

Но была проблема с этим кодом, поскольку эти пустые векторы являются временными объектами, которые будут удалены к тому времени, когда итератор

Прямо сейчас я сделал это прямым путем:

let mut vector = vec![];
if let Some(vc) = vec_0 {
    vector.extend(vc.iter())
}

if let Some(vc) = vec_1 {
    vector.extend(vc.iter())
}

...

if let Some(vc) = vec_n {
    vector.extend(vc.iter())
}

for el in vector {
    ...
}

Этот выглядит громоздким и не очень удобным для чтения.

Есть ли способ перебрать все элементы vec_0, vec_1, et c. Полегче? Я новичок ie в Rust, и мне кажется, что должно быть решение с chain() методом.

Любая помощь будет оценена =)

1 Ответ

1 голос
/ 29 марта 2020

Вы можете использовать API Iterator, чтобы сделать это довольно легко:

fn main() {
    let vec_0 = Some(vec![7, 8, 9]);
    let vec_1 = Some(vec![1, 2, 3]);
    let vec_2 = None;
    let vec_3 = Some(vec![4, 5, 6]);

    let all = [vec_0, vec_1, vec_2, vec_3]; // [Option<Vec<i32>>; 3]

    for i in all
        .iter()
        // Filter out the None yielding an iterator of &Vec<i32>
        .flat_map(|f| f)
        // Yields an iterator of iterator of i32
        .map(|v| v.iter())
        // Flatten this iterator into a single iterator of i32
        .flatten()
    {
        println!("i = {}", i);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...