Почему я не могу собрать итератор Lines в вектор строк? - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь прочитать строки текстового файла в вектор String s, чтобы я мог непрерывно проходить по ним и записывать каждую строку в канал для тестирования, но компилятор жалуется на 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(), компилятор говорит:

error[E0277]: a collection of type `std::vec::Vec<std::string::String>` cannot be built from an iterator over elements of type `std::result::Result<std::string::String, std::io::Error>`
 --> src/main.rs:9:45
  |
9 |     let lines: Vec<String> = reader.lines().collect();
  |                                             ^^^^^^^ a collection of type `std::vec::Vec<std::string::String>` cannot be built from `std::iter::Iterator<Item=std::result::Result<std::string::String, std::io::Error>>`
  |
  = help: the trait `std::iter::FromIterator<std::result::Result<std::string::String, std::io::Error>>` is not implemented for `std::vec::Vec<std::string::String>`

Как мне сказать Rust правильный тип?

1 Ответ

0 голосов
/ 04 декабря 2018

Так как вы хотите собрать прямо в 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>.Я думаю, что этот случай мог бы быть улучшен в будущем, но пока вывод типа не может вывести это.

...