为什么Rust编译器在调用parse时不能推断类型?

时间:2019-05-14 04:53:02

标签: rust

我在Rust中编写一个求和计算器,但是我发现Rust编译器在某些情况下无法推断类型。这是代码。

fn main() {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).unwrap();
    let sum = s.split_whitespace()
        .filter_map(|c| c.parse().ok())
        .fold(0, |a, b| a + b);
    println!("{}", sum);
}

Rust编译器告诉我:

error[E0282]: type annotations needed
 --> src/main.rs:6:22
  |
6 |         .fold(0, |a, b| a + b);
  |                      ^ consider giving this closure parameter a type

但是,IntelliJ IDEA推断类型为i32

如果我们键入let a = 0;,则a的类型默认为i32。我想IDEA会推断0函数的初始值fold的类型为i32,因此可以将第四行的sum类型推断为i32c应该在下一行解析为i32。但是为什么Rust编译器不能推断类型?

我也试图在第四行声明sum类型,Rust编译器给我同样的错误。为什么在这种情况下Rust编译器不能推断类型?

如果我声明parse()类型或按照编译器告诉我的方式进行操作,则它将编译。

1 个答案:

答案 0 :(得分:3)

documentation for parse()(重点是我的)中专门提到了这一点:

  

由于parse太笼统,可能导致类型推断问题。因此,解析是为数不多的几次,您会亲切地看到名为“ turbofish”的语法:::<>。这有助于推理算法特别了解您要解析为哪种类型。

     

parse可以解析实现FromStr特征的任何类型

implementors of FromStr有很多,这就是为什么必须准确告诉Rust要从String解析哪种类型的原因。