MST
星途 面试题库

面试题:Rust中迭代器如何对集合进行过滤操作

假设有一个`Vec<i32>`类型的集合,包含一些整数。请使用Rust的迭代器模式,编写代码过滤出所有偶数,并将这些偶数组成一个新的`Vec<i32>`。说明`filter`方法的工作原理以及它返回的迭代器类型。
40.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
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