包龙星

外面有三千个证人要审,难道我要一个个喊名字让他们进来吗?累死本官了!

雷豹

大人莫慌!用迭代器 (Iterator)!就像传送带一样,把他们一个个自动送上来让您审!

第十二回:阅兵仪式,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);
下一回:锦囊妙计(闭包) →