编译器抱怨变量未初始化,这是正确的。 但是,变量显示在表达式的左侧一侧。
我想我可以通过初始化数组轻松地解决此问题,但是我对理解为什么编译器认为这是错误情况更感兴趣。
我认为其他语言不会将此标记为错误。
这是我的代码:
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`
答案 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)
}
}