第十二回:阅兵仪式,Rust 迭代器
迭代器模式允许你对一个序列中的项进行处理。Rust 的迭代器是惰性 (Lazy) 的,意思是:如果你不喊“开始”,它就动都不动。
1. iter() (检阅)
创建一个迭代器,它会借用集合中的元素。
fn main() {
let witnesses = vec!["张三", "李四", "王五"];
// 此时什么都没发生,只是准备好了传送带
let witness_iter = witnesses.iter();
// 开始消费!
for witness in witness_iter {
println!("审问:{}", witness);
}
}
2. 常用方法 (十八般武艺)
迭代器有很多好用的方法(适配器),可以对数据进行变形。
map (易容术)
对每个元素进行修改。
let numbers = vec![1, 2, 3];
// 给每个数字加倍,收集到一个新列表里
let doubled: Vec = numbers.iter().map(|x| x * 2).collect();
println!("加倍后:{:?}", doubled); // [2, 4, 6]
filter (筛选清官)
只保留符合条件的元素。
let scores = vec![10, 80, 50, 90];
// 只要及格的
let passed: Vec<&i32> = scores.iter().filter(|&&x| x >= 60).collect();
println!("及格的分数:{:?}", passed); // [80, 90]
collect 是什么鬼?为什么一定要加?
迭代器是惰性的!map 只是贴了个标签,collect 才是真正的“收网”!不喊收网,鱼怎么上来?
动手时刻:挑选证人
有一个证人名单,请用迭代器筛选出名字里带 "方" 的人,并把他们的名字打印出来。
fn main() {
let names = vec!["包龙星", "方唐镜", "常威", "方大同"];
// 你的代码
}
查看名册
let fangs: Vec<&&str> = names.iter().filter(|&&n| n.contains("方")).collect();
println!("姓方的有:{:?}", fangs);