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