Я хочу прочитать файл и вернуть вектор String
s. Следующая функция работает, но есть ли более сжатый или идиоматический способ?
use std::fs::File;
use std::io::Read;
fn lines_from_file(filename: &str) -> Vec<String> {
let mut file = match File::open(filename) {
Ok(file) => file,
Err(_) => panic!("no such file"),
};
let mut file_contents = String::new();
file.read_to_string(&mut file_contents)
.ok()
.expect("failed to read!");
let lines: Vec<String> = file_contents.split("\n")
.map(|s: &str| s.to_string())
.collect();
lines
}
Некоторые вещи, которые кажутся мне неоптимальными:
- Две отдельные проверки ошибок для чтения файла.
- Чтение всего файла на
String
, который будет выброшен. Это было бы особенно расточительно, если бы я хотел только первые N строк. - Создание
&str
для каждой строки, которая будет выбрана, вместо того, чтобы как-то перейти прямо из файла вString
в строке.
Как это можно улучшить?