У меня был большой блок кода, который открывает файлы и ищет содержимое по строкам, а затем делает что-то в каждой соответствующей строке. Я хочу включить это в свою собственную функцию, которая берет путь к файлу и дает соответствующие строки, но я не могу понять, как правильно это учесть.Как получить функцию для возврата Vec-подобных строк?
Вот что я думаю, что это близко, но я получаю ошибку компиляции:
/// get matching lines from a path
fn matching_lines(p: PathBuf, pattern: &Regex) -> Vec<String> {
let mut buffer = String::new();
// TODO: maybe move this side effect out, hand it a
// stream of lines or otherwise opened file
let mut f = File::open(&p).unwrap();
match f.read_to_string(&mut buffer) {
Ok(yay_read) => yay_read,
Err(_) => 0,
};
let m_lines: Vec<String> = buffer.lines()
.filter(|&x| pattern.is_match(x)).collect();
return m_lines;
}
и ошибка компилятора:
src/main.rs:109:43: 109:52 error: the trait `core::iter::FromIterator<&str>` is not implemented for the type `collections::vec::Vec<collections::string::String>` [E0277]
src/main.rs:109 .filter(|&x| pattern.is_match(x)).collect();
^~~~~~~~~
src/main.rs:109:43: 109:52 help: run `rustc --explain E0277` to see a detailed explanation
src/main.rs:109:43: 109:52 note: a collection of type `collections::vec::Vec<collections::string::String>` cannot be built from an iterator over elements of type `&str`
src/main.rs:109 .filter(|&x| pattern.is_match(x)).collect();
^~~~~~~~~
error: aborting due to previous error
Если я использую String
вместо &str
вместо этого я получаю эту ошибку:
src/main.rs:108:30: 108:36 error: `buffer` does not live long enough
src/main.rs:108 let m_lines: Vec<&str> = buffer.lines()
^~~~~~
Какой смысл имеет смысл. Я предполагаю, что строки остаются внутри buffer
, который выходит за пределы области действия в конце функции, поэтому сбор вектора ссылок на строки нам действительно не помогает.
Как вернуть набор строк?
Я очень сильно предпочитаю разворачивать, чтобы _, после немых ошибок я никогда не думал, что может случиться укусил меня, когда они сделали. –
@SteveKlabnik совершенно! Я просто очищал код, чтобы быть яснее, что ошибка игнорируется. Я немного подкорректирую текст, чтобы указать, что это определенно не очень хорошая идея. – Shepmaster
Есть ли способ, которым я могу просто вернуть 'Lines' вместо' Vec '? Я продолжаю получать «неправильное количество параметров жизни» –