不可复制类型的数组初始化

Array initialization for non-copyable type

我希望能够做到这一点:

let mut my_array: [MyType; 10] = [MyType::new(1, 2, 3, 4); 10];

MyType 不可复制时,即我希望它为每个元素调用构造函数,而不是调用一次并尝试复制。这可能吗?

是否也可以在构造函数调用中包含数组索引:

let mut my_array: [MyType; 10] = [MyType::new(_index, 2, 3, 4); 10];

这样我的数组就可以用 MyType:new(1,2,3,4)MyType:new(2,2,3,4)MyType:new(3,2,3,4) 等进行初始化

https://doc.rust-lang.org/core/mem/union.MaybeUninit.html#initializing-an-array-element-by-element

你的情况

let mut data: [MaybeUninit<MyType>; 10] = unsafe { MaybeUninit::uninit().assume_init() };

for (i, elem) in data.iter_mut().enumerate() {
    *elem = MaybeUninit::new(MyType::new(i, ..));
}

let arr = unsafe { std::mem::transmute::<_, [MyType; 10]>(data) };

array-init 库提供了一个安全接口来执行此操作:

let mut my_array: [MyType; 10] = array_init(|i| MyType::new(i, 2, 3, 4));