Learn Rust Coding · 课时

适配器与消费者

串联操作

第 3 / 4 课13 个步骤

适配器与消费者 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. Iterator 特征
  2. map、filter、collect
  3. 适配器与消费者
  4. 自定义迭代器
← 返回 Learn Rust Coding