Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Переменные

Переменная — это компонент стека вызовов (фрейма), являющийся либо именованным параметром функции, либо анонимным временным значением, либо именованной локальной переменной.

Локальная переменная (или стек-локальное выделение памяти) хранит значение напрямую, размещенное в памяти стека. Значение является частью стека вызовов (фрейма).

Локальные переменные являются неизменяемыми, если не объявлены иначе. Например: 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`
}
}