【发布时间】:2021-04-04 23:55:34
【问题描述】:
我遇到了 possibly-uninitialized variable 错误,尽管我确信这绝不应该是这种情况。
(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 来“消除”错误。
我强烈反对这种方法,因为
- 由于无法在其他代码路径中计算,临时值在数学意义上可能是错误的。
- 此外,这可能会隐藏在开发过程中未正确定义值这一事实,从而限制编译器发出错误信号的能力。
问题
有人可以澄清这种情况是预期行为还是编译器错误?
【问题讨论】:
-
代码当然没问题。在编译器中,关于未初始化变量的警告在这种情况下出现误报是很正常的,这就是为什么它说“可能”的原因。没有办法在所有情况下都有 100% 正确的警告,因为这是停止问题。
标签: rust compiler-errors compiler-bug