我正在尝试将文本文件的行读入String
s的向量中,因此我可以不断地在它们上循环并将每行写入测试通道,但是编译器抱怨{{1 }}:
collect
编译器抱怨:
use std::fs::File;
use std::io::BufRead;
use std::io::BufReader;
use std::path::Path;
fn main() {
let file = File::open(Path::new("file")).unwrap();
let reader = BufReader::new(&file);
let _: Vec<String> = reader.lines().collect().unwrap();
}
在没有error[E0282]: type annotations needed
--> src/main.rs:9:30
|
9 | let lines: Vec<String> = reader.lines().collect().unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type for `B`
|
= note: type must be known at this point
的情况下,编译器会说:
.unwrap()
如何告诉Rust正确的类型?
答案 0 :(得分:2)
由于您想在Vec<String>
迭代器结束Lines
时直接收集到Result<String, std::io::Error>
中,因此需要对类型推断有所帮助:
let lines: Vec<String> = reader.lines().collect::<Result<_, _>>().unwrap();
甚至只是:
let lines: Vec<_> = reader.lines().collect::<Result<_, _>>().unwrap();
通过这种方式,编译器知道存在一个带有Result<Vec<String>, io::Error>
的中间步骤。我认为这种情况将来可能会有所改善,但是目前类型推断无法推断出这种情况。