MST

星途 面试题库

面试题:Rust迭代器适配器在简单数据过滤中的应用

假设有一个包含整数的`Vec<i32>`,请使用Rust的迭代器适配器筛选出所有偶数,并将它们组成一个新的`Vec<i32>`。请写出具体代码,并解释涉及到的迭代器适配器及其作用。
18.5万 热度难度
编程语言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);
}

涉及的迭代器适配器及其作用:

  1. iter
    • 作用:为Vec<i32>创建一个迭代器。在Rust中,很多集合类型都实现了IntoIterator trait,iter方法返回一个按顺序访问集合元素的迭代器,这里它将Vec<i32>转换为一个可以迭代其元素的迭代器。
  2. filter
    • 作用filter是一个中间迭代器适配器。它接受一个闭包作为参数,该闭包用于判断每个元素是否满足特定条件。对于迭代器中的每个元素,闭包都会被调用,只有闭包返回true的元素才会被保留在迭代器中。这里闭包|&num| num % 2 == 0用于判断元素是否为偶数,只有偶数元素会通过filter
  3. cloned
    • 作用:因为iter返回的是一个Iterator<Item = &i32>,即迭代器中的元素是i32的引用。cloned是一个中间迭代器适配器,它会调用Clone trait 的clone方法,将迭代器中的每个&i32克隆成i32,这样我们后续才能将这些i32收集到一个新的Vec<i32>中(因为collect方法要求迭代器的Item类型能够被克隆,并且i32实现了Clone trait)。
  4. collect
    • 作用collect是一个终端迭代器适配器。它将迭代器中的所有元素收集到一个集合中,这里是将经过筛选和克隆后的偶数i32元素收集到一个新的Vec<i32>中。collect方法通过泛型和FromIterator trait 来确定要收集到的目标集合类型。