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); }