了解类型推理

我想我的数据类型和所有权都有问题。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 在第4行的计算里面,但还是有问题。

我的误解在哪里?

解决方案:

你的假设是正确的。而你的修正也是OK的(它导致了一个不同的错误,见下文)。

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

会让你编译你的程序。

给TA打赏
共{{data.count}}人
人已打赏
未分类

如何从下面的例子中读取XML元素和属性值?

2022-9-8 12:39:42

未分类

Apache 2.4.43将我的url"? "改为"%3F"

2022-9-8 12:50:36

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索