Переменные
Переменная — это компонент стека вызовов (фрейма), являющийся либо именованным параметром функции, либо анонимным временным значением, либо именованной локальной переменной.
Локальная переменная (или стек-локальное выделение памяти) хранит значение напрямую, размещенное в памяти стека. Значение является частью стека вызовов (фрейма).
Локальные переменные являются неизменяемыми, если не объявлены иначе. Например: 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; // ошибка: использование возможно неинициализированной `uninit_after_if` } }