我遇到了可能未初始化的变量错误,尽管我确信这不应该是这种情况。
( rustc --version 是rustc 1.51.0 (2fd73fabe 2021-03-23)
)
fn example(discriminant: bool) {
let value;
if discriminant {
value = 0;
}
// more code [...]
if discriminant {
println!("{}", value);
}
}
这是错误消息:
error[E0381]: borrow of possibly-uninitialized variable: `value`
--> src/raytracing/intersect.rs:8:24
|
10 | println!("{}", value);
| ^^^^^ use of possibly-uninitialized `value`
我确实希望该示例能够编译(即使将if
所示的-blocks 分开并不是“好风格”恕我直言):
discriminant
是不可变的,我希望第二个if
块在没有第一个块的情况下永远不会执行。println!()
。可以通过value
使用临时值进行初始化来“消除”错误。
我强烈不同意这种方法,因为
有人可以澄清这种情况是预期行为还是编译器错误?
您不是第一个看到这种行为的人,通常我不会认为这是一个错误。在你的情况下,条件非常简单和明显,你和我很容易对这种情况进行推理。但是,通常情况下,条件不需要很明显,例如,即使代码是正确的,第二种情况也可能具有难以推理的其他条件。
此外,您希望编译器执行的分析类型(根据条件确定哪些代码可访问)通常仅在编译器优化时进行。因此,即使编译器支持这种分析,它也可能无法在调试模式下工作。即使在最好的优化编译器和静态分析工具中,它也并非在所有情况下都有效。
如果您在这种情况下对初始化虚拟值有哲学上的反对,您可以使用Option
:
fn example(discriminant: bool) {
let value = if discriminant {
Some(0)
} else {
None
};
// more code [...]
if discriminant {
println!("{}", value.unwrap());
}
}
在这种情况下,你的值总是被初始化,在第二部分,你断言它包含一个合适的非None
值。如果您处于发布模式,编译器可能能够确定您的代码是正确的并优化它以省略Option
(或可能不)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句