变量
变量是栈帧的一个组成部分,可以是命名的函数参数、匿名的临时变量,或者命名的局部变量。
局部变量(或栈局部分配)直接保存一个值,该值在栈内存中分配。该值是栈帧的一部分。
局部变量是不可变的,除非另行声明。例如:let mut x = ...
。
函数参数是不可变的,除非用 mut
声明。mut
关键字仅适用于后面的参数。例如:|mut x, y|
和 fn f(mut x: Box<i32>, y: Box<i32>)
声明了一个可变变量 x
和一个不可变变量 y
。
局部变量在分配时不会被初始化。相反,整个帧的局部变量在帧进入时以未初始化的状态分配。函数中的后续语句可能会或可能不会初始化局部变量。局部变量只有在通过所有可达的控制流路径初始化后才能使用。
在下面的示例中,init_after_if
在 if
表达式 之后被初始化,而 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: use of possibly uninitialized `uninit_after_if` } }