【问题标题】:Why does the Rust compiler give an uninitialized variable error when initializing an array in a loop?为什么 Rust 编译器在循环初始化数组时会给出未初始化变量错误?
【发布时间】:2018-11-25 21:07:06
【问题描述】:

编译器抱怨一个变量没有初始化,这是正确的。 但是,变量出现在表达式的左侧

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

我认为这不会在其他语言中被标记为错误。

这是我的代码:

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`

【问题讨论】:

标签: rust


【解决方案1】:

当您执行 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)
    }
}

【讨论】:

  • 感谢您的精彩解释和链接!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多