为什么不能将Lines迭代器收集到Strings向量中?

时间:2018-12-04 10:01:34

标签: string rust text-files

我正在尝试将文本文件的行读入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正确的类型?

1 个答案:

答案 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>的中间步骤。我认为这种情况将来可能会有所改善,但是目前类型推断无法推断出这种情况。