适配器与消费者
串联操作
适配器与消费者 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn Rust Coding 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn Rust Coding 课程共包含 4 节课。
两类方法
迭代器方法分为两组:
- 适配器会返回一个新的迭代器,并且是惰性的(
map、filter、take) - 消费者会运行迭代器并生成最终值(
sum、collect、for_each)
每条流水线都由零个或多个适配器,后接且仅接一个消费者组成。
take:限制数量
take(n) 最多生成 n 个项目,然后停止。它是适配器,因此仍然保持惰性。
即使面对无限迭代器,它也能正常工作,只获取您要求的数量。
fn main() {
let first_three: Vec<i32> = (1..).take(3).collect();
println!("{:?}", first_three);
}skip:忽略前面的项目
skip(n) 会丢弃前 n 个项目,并生成剩余项目。将它与 take 结合,可以从中间截取一个窗口。
fn main() {
let window: Vec<i32> = (1..=10).skip(3).take(4).collect();
println!("{:?}", window);
}enumerate:与索引配对
enumerate 会生成 (index, value) 元组,并从零开始计数。无需手动使用计数器,它是获取位置的惯用方式。
fn main() {
let letters = vec!['a', 'b', 'c'];
for (i, c) in letters.iter().enumerate() {
println!("{} -> {}", i, c);
}
}zip:同时遍历两个迭代器
zip 会将两个迭代器中的项目配对。当较短的迭代器耗尽时,它就会停止。
组合姓名和分数等并行数据时,这种方法非常方便。
fn main() {
let names = vec!["Ana", "Ben"];
let ages = vec![30, 25];
for (name, age) in names.iter().zip(ages.iter()) {
println!("{} is {}", name, age);
}
}rev:反转顺序
rev 会从后往前生成项目。它要求迭代器支持双端操作,而范围和切片都支持这一点。
fn main() {
let backwards: Vec<i32> = (1..=5).rev().collect();
println!("{:?}", backwards);
}chain:连接两个迭代器
chain 会先运行完第一个迭代器,然后继续运行第二个,就像它们是同一个序列一样。
fn main() {
let joined: Vec<i32> = (1..=3).chain(10..=12).collect();
println!("{:?}", joined);
}fold:构建单个值
fold 是通用的消费者。它从一个累加器开始,并使用闭包将每个项目折叠到累加器中。
sum 等许多消费者都是 fold 的特殊情况。
fn main() {
let product = (1..=5).fold(1, |acc, x| acc * x);
println!("5! = {}", product);
}any 和 all:布尔消费者
如果至少有一个项目满足谓词,any 就会返回 true;只有所有项目都满足谓词时,all 才会返回 true。
二者都会短路:一旦结果确定,就会立即停止。
fn main() {
let nums = vec![2, 4, 6, 7];
println!("{}", nums.iter().all(|x| x % 2 == 0));
println!("{}", nums.iter().any(|x| x % 2 != 0));
}find 和 position
find 会将第一个匹配谓词的项目作为 Option 返回;而 position 返回第一个匹配项目的索引。
二者在找到第一个匹配项后都会短路。
fn main() {
let nums = vec![1, 3, 5, 8, 9];
println!("{:?}", nums.iter().find(|&&x| x % 2 == 0));
println!("{:?}", nums.iter().position(|&x| x % 2 == 0));
}设计流水线
通过堆叠适配器来构建流水线,最后以一个消费者结束。请保持可读性:每行执行一个操作。
由于适配器是惰性的,即使链很长,也只会遍历数据一次。
快速检查
适配器与消费者。
回顾
您已经探索了如何串联操作:
- 适配器(
take、skip、enumerate、zip、rev、chain)会保持惰性 - 消费者(
fold、any、all、find、position)会完成处理 - 布尔消费者和搜索消费者会短路
- 每条流水线都先使用适配器,再使用一个消费者
用 AI 导师学习 Rust — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 39
- 课程
- 144
常见问题解答
「适配器与消费者」课时是免费的吗?
是的 — 「适配器与消费者」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 4 节课。
「适配器与消费者」这节课中我会学到什么?
串联操作 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn Rust Coding 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn Rust Coding 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「适配器与消费者」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn Rust Coding 课中编写并运行代码吗?
能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。