首页 > 解决方案 > “显然”无法访问的块中的“借用可能未初始化的变量”错误

问题描述

在下面的代码示例中,编译器可以确定这些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 编译器还不够聪明,还是这种行为有某种目的?是否有任何简单的解决方法可以产生类似的代码结构?

我知道我可以重组代码以使其工作,但就我的目的而言,上述结构是最直接和直观的。我目前的解决方法是注释和取消注释代码块,这并不好玩。谢谢!

标签: 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,它将编译这两种用法而根本不分支,否则不会编译它们中的任何一个。

编译器知道常量表达式条件永远不会改变,但这是在编译的后期处理以进行优化,例如删除分支。


推荐阅读