Я не совсем уверен, что вы имеете в виду, но кажется, что вы хотите использовать Iterator::filter_map()
.Он позволяет вам фильтровать значения Some(T)
, которые затем передаются как развернутые T
s.
Так что вы можете сделать, это преобразовать ваши Result
s в Option
s с Result::ok()
, поэтому Result::Ok(T)
станет Some(T)
, что означает, что он проходит фильтр как T
.
fn main() {
let books = vec![
Book {
data: Ok("type1".to_owned()),
metadata: "meta1".to_owned(),
},
Book {
data: Err("-".to_owned()),
metadata: "meta2".to_owned(),
},
Book {
data: Ok("type2".to_owned()),
metadata: "meta2".to_owned(),
},
];
// metadata without data being error
let (book_type_1, book_type_2): (Vec<_>, Vec<_>) = books
.iter()
.filter_map(|f| {
match &f.data {
Ok(data) => Some((f, data)),
Err(_) => None,
}
})
.partition(|(book, data)| *data == "type1");
println!("Books {:?}", books);
println!("Type 1 {:?}", book_type_1);
println!("Type 2 {:?}", book_type_2);
}
#[derive(Debug)]
struct Book {
data: Result<String, String>,
metadata: String,
}
детская площадка
Я удалил ненужную ссылку на возвращенный секционированный кортеж.
Также обратите внимание, что None
относится к Option<T>
, но вы используете Result<T, E>
.Я думаю, ты знал это, но просто убедился.