Есть ли способ конвертировать Vec`to` Vec <T>`, объединяя все` Vec <T>`s в один` Vec <T>`? - PullRequest
1 голос
/ 11 октября 2019

Допустим, у меня есть идентификатор вектора организации

let orgs = vec![1, 3, 14, 12];

Затем я вызываю .iter() для каждого, чтобы получить события каждой организации, где функция get_events_for() возвращает Vec<Event>

let events = orgs
    .iter()
    .map(|org_id| {
        get_events_for(org_id)
    })
    .collect();

В настоящее время события равны Vec<Vec<Event>>, так как можно преобразовать это в Vec<Event>?

Ответы [ 2 ]

3 голосов
/ 11 октября 2019

flat_map:

let events = orgs
    .iter()
    .flat_map(get_events_for)
    .collect();
2 голосов
/ 12 октября 2019

Вот как будет выглядеть более полная реализация с использованием некоторых ответов, уже приведенных здесь:

#[derive(Debug)]
struct Event {
    id: usize
}

fn main() {
  let orgs = vec![1, 3, 14, 12];

  let events: Vec<Event> = orgs
    .iter()
    .flat_map(|org_id| {
        get_events_for(*org_id)
    })
    .collect();

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

}

fn get_events_for(id: usize) -> Vec<Event> {
   vec![Event {id}]
}

Вывод будет выглядеть так:

[Event { id: 1 }, Event { id: 3 }, Event { id: 14 }, Event { id: 12 }]

Playground

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