第 15 章 迭代器(2)
吉姆•布兰迪
15.3 迭代器适配器
一旦你手头有了迭代器,迭代器的 Iterator 特型就会提供大量适配器方法(也可以简称为适配器)。适配器会消耗某个迭代器并构建一个实现了特定行为的新迭代器。为了阐明适配器的工作原理,我们将从两个最流行的适配器 map 和 filter 开始,然后介绍其他适配器,涵盖了你能想到的从其他序列生成值序列的几乎所有方式:截断、跳过、组合、反转、连接、重复等。
15.3.1 map 与 filter
Iterator 特型的 map(映射)适配器能针对迭代器的各个条目调用闭包来帮你转换迭代器。filter 适配器能使用闭包来帮你从迭代器中过滤某些条目,由闭包决定保留和丢弃哪些条目。
假设你正在逐行遍历文本并希望去掉每一行的前导空格和尾随空格。标准库的 str::trim 方法能从单个 &str 中丢弃前导空格和尾随空格,返回一个新的、修剪过的 &str 借用。你可以通过 map 适配器将 str::trim 应用于迭代器中的每一行:
text.lines() 调用会返回一个生成字符串中各行的迭代器。在该迭代器上调用 map 会返回第二个迭代器,第二个迭代器会对每一行调用 str::trim 并将生成的结果作为自己的条目。最后,collect 会将这些条目收集到一个向量中。
map 返回的迭代器本身当然也可以进一步适配。如果你想将结果中的 iguanas 排除,可以这样写:
在这里,filter 会返回第三个迭代器,它只会从 map 迭代器的结果中生成闭包 |s| *s != "iguanas" 返回 true 的那些条目。迭代器的适配器链条就像 Unix shell 中的管道:每个适配器都有单一用途,并且很清楚此序列是如何在从左到右读取时进行转换的。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
Rust中的迭代器适配器是强大的工具,能够帮助开发者对迭代器进行转换和过滤,生成新的迭代器。本文介绍了常用的适配器,包括`map`、`filter`、`filter_map`、`flat_map`和`flatten`,展示了它们在处理文本行、过滤特定条目、展平嵌套结构等操作中的灵活运用。文章强调了适配器的零成本抽象特性,使用适配器不会增加额外开销。此外,还介绍了`take`、`take_while`、`skip`、`skip_while`、`peekable`和`fuse`等适配器的功能和用法,丰富了读者对迭代器适配器的理解和应用。 文章还探讨了可逆迭代器、`inspect`、`chain`、`enumerate`和`zip`等适配器的特性和使用场景,为读者提供了全面的迭代器适配器知识。此外,介绍了一些高级的迭代器方法,如`by_ref`、`cloned`、`copied`和`cycle`,以及消耗迭代器的方法,如`count`、`sum`、`product`、`min`和`max`,丰富了读者对迭代器的操作和处理方式的认识,为他们提供了更多灵活和高效的编程工具。 总的来说,本文为Rust开发者提供了深入了解和灵活运用迭代器适配器的重要参考价值,同时也为他们展示了更多高级的迭代器操作方法,帮助他们更好地利用Rust语言的特性进行编程。文章展示了迭代器的强大功能和灵活运用,为读者提供了丰富的技术知识和实用工具。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 程序设计(第 2 版)》
《Rust 程序设计(第 2 版)》
立即购买
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论