我相信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];
将允许您编译程序。
关于casting - 了解类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61398171/