Мне нужен итератор, который передает первое буквенное слово каждой строки реализации Read
. Этот итератор:
- Возвращает ошибку, если чтение ввода не удалось
- Возвращает итератор строк, каждая из которых представляет алфавитное слово
- игнорирует пустые строки или первые слова, содержащие символы, отличные от
[a-zA-Z]
Я в итоге получил следующую реализацию ( тест здесь ):
fn get_first_words<'a>(r: &'a mut impl Read) -> impl Iterator<Item = Result<String>> + 'a {
BufReader::new(r).lines().filter_map(|rline| {
match rline.map(|line| {
line.split_whitespace()
.next()
.filter(|word| word.chars().all(char::is_alphabetic))
.map(&str::to_string)
}) {
Err(e) => Some(Err(e)),
Ok(Some(w)) => Some(Ok(w)),
Ok(None) => None,
}
})
}
Это отлично работает, но оказалось сложнее, чем я ожидал. В этой реализации есть вложенные итераторы, и было некоторое жонглирование типов, чтобы сохранить Result
в качестве типа переноса при фильтрации по содержащимся значениям.
Может ли это быть написано проще, с менее вложенной логикой и с меньшим количеством жонглирования типов?