casting - 了解类型推断

标签 casting rust optional ownership inference

我相信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,但是仍然有问题。

  • 我的误解在哪里?

    最佳答案

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

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

    相关文章:

    Typescript - 如何禁止两种解析为相同类型的类型别名互换使用?

    sql - 在 SQL Server 中将字符串转换为货币值

    java - Java中的不可转换类型错误

    multidimensional-array - 有没有一种好方法可以在使用rust 的 ndarray 中进行重叠复制?

    arrays - 使用 #[!no_std] 通过 FFI 将数组从 C 传递到 Rust

    c++ - 为什么不使用强制转换语法调用 "operator void"?

    rust - 进行unwrap_or_return的任何方式以尽早返回

    scala - 用于选项的惯用 Scala 代替 if/else/else 链

    java - 如何避免使用 Optional.get 和 Optional.isPresent

    excel - 函数 optional 参数日期类型失败