为什么Rust编译器在循环中初始化数组时会给出未初始化的变量错误?

Muf*_*ffo 2 rust

编译器抱怨变量未初始化,它是正确的.但是,变量出现在表达式的左侧.

我想我可以通过初始化数组轻松解决这个问题,但我更感兴趣的是理解为什么编译器认为这是一个错误条件.

我认为这不会被标记为其他语言的错误.

这是我的代码:

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),
    }
}
Run Code Online (Sandbox Code Playgroud)

这是错误:

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`
Run Code Online (Sandbox Code Playgroud)

Fre*_*ios 5

当你执行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)
    }
}
Run Code Online (Sandbox Code Playgroud)