rust要求每个元素都必须被初始化
struct Point {
x: u32,
y: u32,
}
let p: [Point; 2] = [Point { x: 1, y: 2 }, Point { x: 2, y: 3 }];
用不安全的代码 MaybeUninit
use std::{mem::MaybeUninit, ptr};
let p = unsafe {
let mut p = MaybeUninit::<[Point; 2]>::uninit();
let h = p.as_mut_ptr() as *mut Point;
ptr::write(h.offset(0), Point { x: 1, y: 2 });
ptr::write(h.offset(1), Point { x: 2, y: 3 });
p.assume_init()
};
用None初始化
let mut p: [Option<Point>; 2] = [None, None];
p[0] = Some(Point { x: 1, y: 2 });
p[1] = Some(Point { x: 2, y: 3 });
用ArrayVec
let p = {
let mut p = ArrayVec::<[Point; 2]>::new();
p.insert(0, Point { x: 1, y: 2 });
p.insert(1, Point { x: 2, y: 3 });
p.into_inner()
};
用Vec来代替数组
let mut test_vec = Vec::with_capacity(20);
for _ in 0..2 {
vec.push(Point { x: 1, y: 2 });
}
用Clone trait来初始化, 这仅仅对实现了Copy trait 的基本类型有用
#[derive(Debug)]
struct Point {
a: i32,
b: u32,
}
impl Copy for Point {}
impl Clone for Point {
fn clone(&self) -> Point {
Point{a: self.a, b: self.b}
}
}
impl Point {
fn new() -> Point {
Point {a: 1, b: 2}
}
}
fn main() {
let test_var = Point::new();
let test_array = [Point::new(); 4];
println!("test_var: {:#?}", test_var);
println!("test_array: {:#?}", test_array);
}