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

时间:2018-11-25 21:07:07

标签: 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),
    }
}

这是错误:

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 :(得分:5)

当执行for循环时,代码是顺序的:编译器首先将值设置为索引0,然后是1,依此类推,但是不知道您是否以此方式初始化数组。例如,您可以忘记最后一个索引,并且您的代码将无效。

简单地说:仅当变量初始化arr是您的变量而不是arr[0]时,您才能修改

当您在Rust中为某些内容编制索引时,该内容将减为index_mut method。根据您的情况,您正在调用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)
    }
}