Почему компилятор Rust выдает ошибку неинициализированной переменной при инициализации массива в цикле? - PullRequest
0 голосов
/ 26 ноября 2018

Компилятор жалуется, что переменная не инициализирована, и это правильно.Тем не менее, переменная появляется в левой части выражения.

Я думаю, я мог бы легко это исправить путем инициализации массива, но мне больше интересно понять, почему компилятор считает, что этоусловие ошибки.

Я не думаю, что это будет помечено как ошибка на других языках.

Вот мой код:

fn main() {
    const LEN: usize = 5;
    let mut arr: [u32; LEN];

    for i in 0..LEN {
        arr[i] = fib(i as u32);
    }

    println!("{:?}", arr);
}

fn fib(n: u32) -> u32 {
    match n {
        0 => 0,
        1 => 1,
        _ => fib(n - 1) + fib(n - 2),
    }
}

Вот ошибка:

error[E0381]: use of possibly uninitialized variable: `arr`
 --> src/main.rs:6:9
  |
6 |         arr[i] = fib(i as u32);
  |         ^^^^^^^^^^^^^^^^^^^^^^ use of possibly uninitialized `arr`

error[E0381]: use of possibly uninitialized variable: `arr`
 --> src/main.rs:9:22
  |
9 |     println!("{:?}", arr);
  |                      ^^^ use of possibly uninitialized `arr`

1 Ответ

0 голосов
/ 26 ноября 2018

Когда вы выполняете цикл for, код является последовательным: компилятор сначала устанавливает значение в индекс 0, затем 1 и т. Д., Но он не имеет ни малейшего представления, что вы инициализируете массив таким образом.Например, вы можете забыть последний индекс, и ваш код будет недействительным.

Проще говоря: можно изменить переменную только тогда, когда она инициализирована , а arr - это ваша переменная, а не arr[0].

Когда вы индексируете что-то в Rust, это десагадируется в index_mut метод .В вашей ситуации вы вызываете метод arr, который является неинициализированной переменной.


Как вы сказали, решение вашей проблемы - сначала инициализировать ваш массив, например, с нулями:

fn main() {
    const LEN : usize = 5;
    let mut arr = [0; LEN];

    for i in 0..LEN {
        arr[i] = fib(i as u32);
    }

    println!("{:?}", arr);
}


fn fib(n: u32) -> u32 {
    match n {
        0 => 0,
        1 => 1,
        _ => fib(n-1) + fib(n-2)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...