Dul*_*gon 3 parsing types type-inference rust
下面的代码读取数字,对它们求和,然后打印总和。我尝试了一些注释,但没有成功。我肯定错过了什么。我怎样才能让它发挥作用?
use std::io;
use std::io::Read;
fn main() {
let mut buff = String::new();
io::stdin().read_to_string(&mut buff).expect("read_to_string error");
let v: i32 = buff
.split_whitespace()
.filter_map(|w| w.parse().ok())
.sum();
println!("{:?}", v);
}
Run Code Online (Sandbox Code Playgroud)
来自编译器的错误消息:
use std::io;
use std::io::Read;
fn main() {
let mut buff = String::new();
io::stdin().read_to_string(&mut buff).expect("read_to_string error");
let v: i32 = buff
.split_whitespace()
.filter_map(|w| w.parse().ok())
.sum();
println!("{:?}", v);
}
Run Code Online (Sandbox Code Playgroud)
让我们查看filter_map的签名,看看抱怨的内容是什么:
fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F> where F: FnMut(Self::Item) -> Option<B>,
Run Code Online (Sandbox Code Playgroud)
好吧,Option<B>
结果也是如此,这意味着他无法推断w.parse().ok()
会发生什么。
我们试着给他一个提示
.filter_map(|w| w.parse::<i32>().ok())
Run Code Online (Sandbox Code Playgroud)
让我们编译一下看看……万岁!
因此,吸取的教训是:查找签名并尝试找出编译器无法推断的部分并尝试指定它。
归档时间: |
|
查看次数: |
3171 次 |
最近记录: |