Я копирую ответ chris-morgan и адаптируя его для лучшего ответа на вопрос, чтобы следовать рекомендации dbaupp downthread и соответствовать последним синтаксическим изменениям:
use std::mem;
use std::ptr;
#[derive(Debug)]
struct Thing {
number: usize,
}
macro_rules! make_array {
($n:expr, $constructor:expr) => {{
let mut items: [_; $n] = mem::uninitialized();
for (i, place) in items.iter_mut().enumerate() {
ptr::write(place, $constructor(i));
}
items
}}
}
const SIZE: usize = 50;
fn main() {
let items = unsafe { make_array!(SIZE, |i| Box::new(Some(Thing { number: i }))) };
println!("{:?}", &items[..]);
}
Обратите внимание на необходимость использования unsafe
здесь: проблема в том, что если функция конструктора panic!
s, это приведет к неопределенному поведению.