我在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
类型推断为i32
和c
应该在下一行解析为i32
。但是为什么Rust编译器不能推断类型?
我也试图在第四行声明sum
类型,Rust编译器给我同样的错误。为什么在这种情况下Rust编译器不能推断类型?
如果我声明parse()
类型或按照编译器告诉我的方式进行操作,则它将编译。
答案 0 :(得分:3)
在documentation for parse()
(重点是我的)中专门提到了这一点:
由于
parse
太笼统,可能导致类型推断问题。因此,解析是为数不多的几次,您会亲切地看到名为“ turbofish”的语法:::<>
。这有助于推理算法特别了解您要解析为哪种类型。
parse
可以解析实现FromStr
特征的任何类型。
implementors of FromStr
有很多,这就是为什么必须准确告诉Rust要从String
解析哪种类型的原因。