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



下面的rust代码是一个简化版本,我的代码需要使用延迟初始化,我想知道如何消除错误。

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

报价错误[E0381]:借用可能未初始化的变量:header

->src/main.rs:8:22

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

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

  1. 让标题:Vec=Vec![]
  2. 添加头为..的else块

但它们都不是理想的方式!

更常见的模式是使用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());
}
}

最新更新