不可复制类型的数组初始化
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));
我希望能够做到这一点:
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));