假设我有attrs: Vec<Attribute>
一些函数属性和一个fn map_attribute(attr: &Attribute) -> Result<TokenStream, Error>
将属性映射到某些代码的函数。
我知道我可以写这样的东西:
attrs.into_iter()
.map(map_attribute)
.collect::<Result<Vec<_>, _>()?
然而,这不是我想要的。我想要的是一次吐出所有错误,而不是停止第一个错误。目前我做这样的事情:
let mut codes : Vec<TokenStream> = Vec::new();
let mut errors: Vec<Error> = Vec::new();
for attr in attrs {
match map_attribute(attr) {
Ok(code) => codes.push(code),
Err(err) => errors.push(err)
}
}
let mut error_iter = errors.into_iter();
if let Some(first) = error_iter.nth(0) {
return Err(iter.fold(first, |mut e0, e1| { e0.combine(e1); e0 }));
}
第二个版本可以满足我的要求,但比第一个版本要冗长得多。如果可能的话,是否有更好/更惯用的方法来实现这一点,而无需创建我自己的迭代器?