use std::fmt::Debug;
fn process_data<I, F, T>(iter: I, mut f: F) -> Vec<T>
where
I: IntoIterator,
I::Item: Clone + Debug,
F: FnMut(I::Item) -> T,
T: Debug,
{
iter.into_iter()
.map(|item| f(item))
.collect()
}
关键设计点解释
- 泛型参数:
I
代表迭代器类型,通过 IntoIterator
特征约束,这样可以接受多种类型的迭代器,如 Vec
、&[T]
等。
F
代表闭包类型,通过 FnMut
特征约束,因为闭包在每次调用时可能会修改其内部状态。
T
代表闭包返回的类型,通过 Debug
特征约束,满足题目中结果类型需要实现 Debug
特征的要求。
- 特征约束:
I::Item: Clone + Debug
确保迭代器中的元素类型实现了 Clone
和 Debug
特征,满足题目要求。
T: Debug
确保闭包返回的类型实现了 Debug
特征。
- 性能优化:
- 使用
map
方法对迭代器中的每个元素应用闭包,这是一种高效的方式,避免了手动遍历迭代器的冗余代码。
- 通过
collect
方法将映射后的结果直接收集到 Vec
中,减少了中间变量和不必要的克隆操作。这里直接对迭代器进行操作,而不是先将迭代器内容克隆到一个中间集合再操作,符合避免不必要克隆操作的要求。