编译器抱怨变量未初始化,它是正确的.但是,变量出现在表达式的左侧.
我想我可以通过初始化数组轻松解决这个问题,但我更感兴趣的是理解为什么编译器认为这是一个错误条件.
我认为这不会被标记为其他语言的错误.
这是我的代码:
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)
当你执行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)
| 归档时间: |
|
| 查看次数: |
171 次 |
| 最近记录: |