我相信我在iter
的数据类型和所有权上都遇到了问题。它首先在for
循环表达式中声明。我相信Rust会推断iter
的类型为u16
,因为它已在第4行的计算中使用。
1 let mut numbers: [Option<u16>; 5];
2 for iter in 0..5 {
3 let number_to_add: u16 = { // `iter` moves to inner scope
4 ((iter * 5) + 2) / (4 * 16) // Infers `iter: u16`
5 };
6
7 numbers[iter] = Some(number_to_add); // Expects `iter: usize`
8 }
我收到以下错误:
error[E0277]: the type `[std::option::Option<u16>]` cannot be indexed by `u16`
--> exercises/option/option1.rs:3:9
|
7 | numbers[iter] = Some(number_to_add);
| ^^^^^^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
iter
强制转换为u16
,但仍然有问题。我的误解在哪里?
您的假设是正确的。而且您的修复也还可以(它导致了另一个错误,请参见下文)。
您的第一个问题是,对于切片索引,iter的类型必须为usize
,所以要么]
numbers[iter as usize] = Some(number_to_add);
或
((iter as u16 * 5) + 2) / (4 * 16)
将通过rustc导致正确的类型推断。
您的第二个问题是数字尚未初始化,因此在尝试修改数字时,rustc会正确警告您。分配一个值,例如
let mut numbers: [Option<u16>; 5] = [None; 5];
将让您编译程序。
除了现有的答案,更高级别的方法也可能更简洁(取决于口味)
您的推理是正确的。只需添加一下,如果您只想初始化数组,则还可以考虑采用这种方式: