理解类型推断

问题描述 投票:0回答:3

我相信我在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`
  • 我尝试在第4行的计算中将iter强制转换为u16,但仍然有问题。

我的误解在哪里?

casting rust optional ownership inference
3个回答
1
投票

您的假设是正确的。而且您的修复也还可以(它导致了另一个错误,请参见下文)。

您的第一个问题是,对于切片索引,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];

将让您编译程序。


1
投票

除了现有的答案,更高级别的方法也可能更简洁(取决于口味)


1
投票

您的推理是正确的。只需添加一下,如果您只想初始化数组,则还可以考虑采用这种方式:

© www.soinside.com 2019 - 2024. All rights reserved.