rust - “显然”无法访问的块中的“借用可能未初始化的变量”错误
问题描述
在下面的代码示例中,编译器可以确定这些if
块不可访问,但它仍然给我一个错误。
const A_MODE: bool = false; // I manually edit this to switch "modes"
fn main() {
let a: Vec<u32>;
if A_MODE {
a = vec![1,2,3];
}
if A_MODE {
println!("a: {:?}", a); // error: borrow of possibly uninitialized variable
}
}
我想也许编译器真的想告诉我我需要a
在某个时候初始化,但这编译得很好:
fn main() {
let a: Vec<u32>;
println!("Finished.");
}
错误是因为 Rust 编译器还不够聪明,还是这种行为有某种目的?是否有任何简单的解决方法可以产生类似的代码结构?
我知道我可以重组代码以使其工作,但就我的目的而言,上述结构是最直接和直观的。我目前的解决方法是注释和取消注释代码块,这并不好玩。谢谢!
解决方案
编译器不会在验证生命周期和所有权的阶段扩展常量表达式,因此对编译器来说不是“显而易见的”。
如果您真的不想运行该块,则可能需要使用#[cfg]
(或者如果您喜欢 if 语法,则使用 cfg-if 板条箱)。
fn main() {
let a: Vec<u32>;
#[cfg(a-mode)] {
a = vec![1,2,3];
}
#[cfg(a-mode)] {
println!("a: {:?}", a); // error: borrow of possibly uninitialized variable
}
}
这样,如果设置了 a-mode cfg,它将编译这两种用法而根本不分支,否则不会编译它们中的任何一个。
编译器知道常量表达式条件永远不会改变,但这是在编译的后期处理以进行优化,例如删除分支。
推荐阅读
- c++ - 现有文件和正确路径出现“无法打开源文件”错误
- android - 解决“尝试调用接口方法java.lang.String com.facebook.react.bridge.ReadableMap.getString(java.lang.String)”
- vba - 解锁时在受保护的宏上显示密码
- python - When is unittest.addCleanup() executed?
- json - Symfony 4 - 使用 json 提交的复杂表单
- html - 以下情况的 XSLT 到 HTML
- visual-studio-code - 如何在 Visual Studio 代码中查找所有出现的单词或字符并进行编辑?
- python - 确定循环中的第一次出现
- bash - ldapsearch script with an input file
- pandas - 在 MultiIndexed 数据框中为多行显示一个值