如何在 Rust 代码中使用延迟初始化并通过编译器 "possibly-uninitialized variable" 规则?

How to use delayed initialization in rust code and pass compiler "possibly-uninitialized variable" rule?

以下rust代码为简化版,我的代码需要使用延迟初始化,想知道如何排除错误。

fn main() {
    let header: Vec<char>;
    let index = 0;
    if index == 0 {
        header = "abc".chars().collect();
        println!("{:?}", header);
    }
    println!("{}", header.len());
}

quote error[E0381]: borrow of possibly-uninitialized variable: header

--> src/main.rs:8:22

  |
8 |     println!("{:?}", header.len());
  |                      ^^^^^^ use of possibly-uninitialized `header`

我知道有两种方法可以消除错误,包括:

  1. 让header: Vec = vec![];
  2. 添加 else 块 header = ..;

但都不是想要的方式!

更常见的模式是使用Option然后调用unwrap(),但如果真的必须分配然后再写,这就是MaybeUninit的目的。您创建一些未初始化的内存,然后对其进行初始化,然后告诉编译器它已被初始化。 API 类似于 Option,不同之处在于您将填充数据而不是重新分配或替换。

let mut header = std::mem::MaybeUninit::<Vec<char>>::uninit();
let index = 0;
if index == 0 {
    unsafe {
        header.as_mut_ptr().write("abc".chars().collect());
    }
    println!("{:?}", header);
}
let header = unsafe { std::mem::MaybeUninit::assume_init(header) };
println!("{}", header.len());

我给出@piojo的答案:

fn main() {
    let mut header: Option<Vec<char>> =  None;
    let index = 0;
    if index == 0 {
        header.replace( "abc".chars().collect()  ) ;
        println!("{:?}", header.unwrap());
    }else{
        println!("{}", header.unwrap().len());
    }
}