#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()
.