我正在寻找一种方法来消除此示例中的临时向量分配:
这是一个带有错误处理的迭代器变体,但我不想创建一个集合(因此
请注意,这会给出错误的结果,因为
fn doit<T: Iterator<Item = Result<i32, &'static str>>>(name: &str, iter: T) {
println!(
"{}: {:?}",
name,
iter.collect::<Result<Vec<_>, _>>()
.map(|v| v.into_iter().min())
);
}
fn main() {
let without_errors = vec![Ok(1), Ok(2), Ok(3)];
let with_errors = vec![Ok(1), Err("error"), Ok(2)];
doit("without errors", without_errors.into_iter());
doit("with errors", with_errors.into_iter());
}
这是一个带有错误处理的迭代器变体,但我不想创建一个集合(因此
collect()
不能完成任务),而是想对正在迭代的元素执行进一步的操作。请注意,这会给出错误的结果,因为
Ok
小于Err
。fn doit<T: Iterator<Item = Result<i32, &'static str>>>(name: &str, iter: T) {
println!("{}: {:?}", name, iter.min());
}
这会意外地给出max()
的正确结果,但它不会在第一个错误处停止迭代。
Result
时,代码具有异常控制流。迭代器可能不是这种逻辑的最佳选择。即使采用try_fold
方法,也可能会显得有些笨拙和嘈杂。我们不应忘记简单的for循环。 - Fifnmar