变量

变量 是栈帧的组成部分,包括函数的具名参数、匿名的 临时变量 或具名的局部变量。

局部变量 (或称为 栈局部变量 分配) 将直接持有一个值,该值在内存栈中分配。该值是栈帧的一部分。

除非另有声明,否则局部变量是不可变的。例如: let mut x = ...

除非声明为 mut ,函数参数是不可变的,mut 关键字仅适用于其后面的参数。 例如: |mut x, y|fn f(mut x: Box<i32>, y: Box<i32>) 声明了一个可变变量 x 和一个不可变变量 y

局部变量在分配时不会初始化。整个栈帧的局部变量在进入栈帧时以未初始化状态进行分配。 函数内的语句有可能会或不会初始化局部变量。只有在通过所有可达控制流路径初始化后,局部变量才能被使用。

译注: 栈帧是指对一个函数所使用的局部变量在内存栈上的一次分配操作。

在下面的例子中,init_after_ifif 表达式 后被初始化,而 uninit_after_if 没有被初始化,因为它在 else 分支中没有被初始化。

#![allow(unused)]
fn main() {
fn random_bool() -> bool { true }
fn initialization_example() {
    let init_after_if: ();
    let uninit_after_if: ();

    if random_bool() {
        init_after_if = ();
        uninit_after_if = ();
    } else {
        init_after_if = ();
    }

    init_after_if; // ok
    // uninit_after_if; // err: 使用可能未初始化 `uninit_after_if`
}
}