如何在 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`
我知道有两种方法可以消除错误,包括:
- 让header: Vec = vec![];
- 添加 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());
}
}
以下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`
我知道有两种方法可以消除错误,包括:
- 让header: Vec = vec![];
- 添加 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());
}
}