面试题答案
一键面试fn main() {
let numbers: Vec<i32> = vec![1, 2, 3, 4, 5, 6];
let evens: Vec<i32> = numbers.iter().filter(|&num| num % 2 == 0).cloned().collect();
println!("{:?}", evens);
}
filter
方法的工作原理:它会遍历集合中的每一个元素,并对每个元素应用给定的闭包。如果闭包返回true
,则该元素会保留在结果迭代器中;如果返回false
,则该元素会被过滤掉。
filter
方法返回的迭代器类型是Filter<I, P>
,其中I
是输入迭代器的类型,P
是闭包的类型。在上述代码中,filter
方法返回的迭代器类型为Filter<Iter<'_, i32>, impl FnMut(&i32) -> bool>
。因为numbers.iter()
返回的是Iter<'_, i32>
类型的迭代器,而闭包|&num| num % 2 == 0
是一个实现了FnMut(&i32) -> bool
的闭包。由于filter
返回的迭代器中的元素是原集合元素的引用,要收集到Vec<i32>
中,需要使用cloned()
方法将&i32
转换为i32
。