Я пытаюсь найти элегантный способ заполнить вектор структурных элементов циклом или логикой вместо того, чтобы писать по одному .push()
для каждого создаваемого мной элемента.
Элемент struct
является вопросомс гораздо большим количеством полей, чем в следующем примере, и экземпляры должны быть изменяемыми, поскольку они изменяются пользовательским вводом:
struct Question {
id: usize,
question: String,
}
fn main() {
//A large and growing list of questions
let mut q0 = Question {
id: 0,
question: String::from("A field I fill in manually"),
};
// .
// .
// .
let mut q100 = Question {
id: 100,
question: String::from("Another field, each one is different"),
};
let total_questions: usize = 100;
let mut w: Vec<String> = Vec::new();
for a in 0..total_questions {
let s = format!("q{}", a);
w.push(s);
}
//w contains ["q0", "q1", ..., "q100"] but is of type std::string::String
let mut v: Vec<&mut Question> = Vec::new();
//Expects type struct `main::Question`
//I would like to avoid :
v.push(&mut q0);
v.push(&mut q1);
// .
// .
// .
v.push(&mut q100);
}
Я не уверен, что в моем примере w: Vec<String>
имеет какое-либо применение.
Я изучил .collect()
, но не мог понять, как использовать его в моем случае.
Я был бы рад ответить на аналогичный вопрос, если у меня есть дубликатне найден.
Редактировать: Я изменил содержимое структуры Structs, поскольку оно вводило в заблуждение. Каждая из них содержит строки, которые являются уникальными и не могут быть сгенерированы. Я также понял, что переполнение стека автоматически включает это в some_fn()
функцию, когда мы на самом деле внутри main()