Лучший способ получить вектор с определенным полем, сформировать вектор структур?

#rust

#Ржавчина

Вопрос:

Возможно, вопрос не совсем понятен, но прост. Допустим, у меня есть структура Rust.

 struct Person{
    _id: u32,
    name: String,
}
 

И вектор такой структуры.

 people: Vec<Person> = foo

 

Есть ли более приятный способ получить вектор, скажем, с помощью all Persons _id? Моим первым побуждением было просто написать цикл for .

 let mut people_ids: vec<String> = vec![];
for person in people{
  people_ids.push(person._id)
}
people_ids
 

И, конечно, это работает.Но если вы работаете со структурами с несколькими полями и хотите получить несколько векторов разных полей, написание цикла for для каждого поля становится очень повторяющимся. Интересно, какой лучший и более общий способ сделать это?

Ответ №1:

Прежде всего, вы не должны начинать поля структуры с подчеркивания. Тем не менее, это работает:

 let people_ids: Vec<_> = people.iter().map(|p| p._id).collect();
 

Комментарии:

1. Это работает для обязательных типов полей, но не для типов, выделенных в куче, таких как std::string::String или Vec<T> , по крайней мере, для меня это не сработало. Но все же, очень полезно для многих случаев. Спасибо.

2. @chaoticsystem В этом случае вам нужно клонировать значения, попробуйте, например p.name.clone() .