Rust:官方迭代器大全

2023-05-16

一、for 和迭代器

先看一段代码:

fn main() {
    for x in [1, 2, 3, 4, 5] {
        println!("{:?}", x);
    }
}
======== cargorun ========
1
2
3
4
5

如果 for 语句只能用于数组,那就太可惜了。我们看一下 Vec 类型:

fn main() {
    let list: Vec<i32> = vec![1, 2, 3, 4, 5];
    for x in list {
        println!("{:?}", x);
    }
}
======== cargorun ========
1
2
3
4
5

OK!
那么,我自己编写的数据类型能否这样用呢?
看代码:

struct MyList {
    list: [i32; 5],
}
fn main() {
    let list = MyList {
        list: [1, 2, 3, 4, 5],
    };
    for x in list {
        println!("{:?}", x);
    }
}
======== cargorun ========
8 |     for x in list {
  |              ^^^^ `MyList` is not an iterator

错误信息说,MyList 不是迭代器。原来,for 循环是和迭代器协同工作的。如果想让 MyList 用于 for 循环,必须实现迭代特性。

二、编写自己的迭代器

通过实现 Trait Iterator,可以编写自己的迭代器。

struct MyList {
    list: [i32; 5],
    index: usize,
}
impl MyList {
    fn from(list: [i32; 5]) -> Self {
        Self {
            list: list,
            index: 0,
        }
    }
}
impl Iterator for MyList {
    type Item = i32;
    fn next(&mut self) -> Option<Self::Item> {
        if self.index < 5 {
            let result = self.list[self.index];
            self.index += 1;
            return Some(result);
        } else {
            return None;
        }
    }
}
fn main() {
    let list = MyList::from([1, 2, 3, 4, 5]);
    for x in list {
        println!("{:?}", x);
    }
}
======== cargorun ========
1
2
3
4
5

三、iter() 迭代器

一般而言,Vec、HashMap 等类型通过方法 iter()、iter_mut() 等方法把自己转换成迭代器。下面我们也写一个 iter() 函数。

struct MyList {
    list: [i32; 5],
}

struct MyListIterator<'a> {
    index: i32,
    owner: &'a MyList,
}

impl Iterator for MyListIterator<'_> {
    type Item = i32;
    fn next(&mut self) -> Option<Self::Item> {
        self.index += 1;
        if self.index < 5 {
            Some(self.owner.list[self.index as usize])
        } else {
            None
        }
    }
}

impl MyList {
    fn iter(&self) -> MyListIterator {
        MyListIterator {
            index: -1,
            owner: self,
        }
    }
}
fn main() {
    let list = MyList {
        list: [1, 2, 3, 4, 5],
    };
    for x in list.iter() {
        println!("{:?}", x);
    }
}
======== cargorun ========
1
2
3
4
5

四、Rust 系统内置迭代器

Trait Iterator 自身定义了许多迭代器,这里给一个清单,具体可以参见 Rust 源代码 iterator.rs 注释说明。

名称声明用途
size_hintfn size_hint(&self) -> (usize, Option<usize>)返回迭代器剩余长度的界限。
countfn count(self) -> usize消费迭代器,计算迭代次数并返回它。
lastfn last(self) -> Option<Self::Item>消费迭代器,返回最后一个元素。
nthfn nth(&mut self, n: usize) -> Option<Self::Item>返回迭代器的第n个元素。
step_byfn step_by(self, step: usize) -> StepBy<Self>创建一个迭代器,该迭代器从同一点开始,但在每次迭代时按给定的数量步进。
chainfn chain<U>(self, other: U) -> Chain<Self, U::IntoIter>创建两个迭代器,并按顺序在这两个迭代器上创建一个新的迭代器。
zipfn zip<U>(self, other: U) -> Zip<Self, U::IntoIter>将两个迭代器“向上拉”成一对迭代器。
interspersefn intersperse(self, separator: Self::Item) -> Intersperse<Self>创建一个新迭代器,将分隔符的副本放置在原始迭代器的相邻项之间。
intersperse_withfn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>创建一个新的迭代器,将由分隔符生成的项放置在原始迭代器的相邻项之间。
mapfn map<B, F>(self, f: F) -> Map<Self, F>获取一个闭包并创建一个迭代器,该迭代器对每个元素调用该闭包。
for_eachfn for_each<F>(self, f: F)对迭代器的每个元素调用闭包。
filterfn filter<P>(self, predicate: P) -> Filter<Self, P>创建一个迭代器,该迭代器使用闭包来确定是否应生成元素。
filter_mapfn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>创建一个同时过滤和映射的迭代器。
enumeratefn enumerate(self) -> Enumerate<Self>创建一个迭代器,该迭代器给出当前迭代计数和下一个值。
peekablefn peekable(self) -> Peekable<Self>创建一个迭代器,可以使用[peek]和[peek_mut]方法查看迭代器的下一个元素,而无需使用它。有关更多信息,请参阅他们的文档。
skip_whilefn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>创建一个迭代器,该迭代器基于谓词[跳过]元素。
take_whilefn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>创建一个迭代器,该迭代器根据谓词生成元素。
map_whilefn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>创建一个迭代器,该迭代器基于谓词和映射生成元素。
skip fn skip(self, n: usize) -> Skip<Self>创建跳过前n个元素的迭代器。
takefn take(self, n: usize) -> Take<Self>创建一个迭代器,该迭代器生成前n个元素,如果基础迭代器结束得更早,则生成的元素更少。
scanfn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>类似于[fold]的迭代器适配器,它保存内部状态并生成新的迭代器。
flat_mapfn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>创建一个迭代器,其工作方式类似于map,但会展平嵌套结构。
flattenfn flatten(self) -> Flatten<Self>创建一个迭代器,用于展平嵌套结构。
fuse fn fuse(self) -> Fuse<Self>创建一个迭代器,该迭代器在第一个None之后结束。
inspectfn inspect<F>(self, f: F) -> Inspect<Self, F>对迭代器的每个元素执行某些操作,并传递值。
by_reffn by_ref(&mut self) -> &mut Self借用迭代器,而不是消费它。
collectfn collect<B: FromIterator<Self::Item>>(self) -> B将迭代器转换为集合。
partition fn partition<B, F>(self, f: F) -> (B, B)消费一个迭代器,从中创建两个集合。
partition_in_place fn partition_in_place<'a, T: 'a, P>(mut self, ref mut predicate: P) -> usize根据给定的谓词对迭代器的元素进行适当的重新排序,使所有返回true的元素优先于所有返回false的元素。返回找到的true元素数。
is_partitionedfn is_partitioned<P>(mut self, mut predicate: P) -> bool检查此迭代器的元素是否根据给定谓词进行了分区,以便所有返回true的元素优先于所有返回false的元素。
try_foldfn try_fold<B, F, R>(&mut self, init: B, mut f: F) -> R一种迭代器方法,只要函数成功返回,就会应用它,生成一个最终值。
try_for_eachfn try_for_each<F, R>(&mut self, f: F) -> R一种迭代器方法,对迭代器中的每个项应用一个易出错函数,在第一个错误处停止并返回该错误
foldfn fold<B, F>(mut self, init: B, mut f: F) -> B通过应用操作将每个元素折叠到累加器中,返回最终结果。
reducefn reduce<F>(mut self, f: F) -> Option<Self::Item>通过反复应用缩减操作,将元素缩减为单个元素。
allfn all<F>(&mut self, f: F) -> bool测试迭代器的每个元素是否与谓词匹配。
anyfn any<F>(&mut self, f: F) -> bool测试迭代器的任何元素是否与谓词匹配。
findfn find<P>(&mut self, predicate: P) -> Option<Self::Item>搜索迭代器中满足谓词的元素。
find_mapfn find_map<B, F>(&mut self, f: F) -> Option<B>将函数应用于迭代器的元素,并返回第一个非 none 结果。
try_findfn try_find<F, R, E>(&mut self, f: F) -> Result<Option<Self::Item>, E>将函数应用于迭代器的元素,并返回第一个真结果或第一个错误。
positionfn position<P>(&mut self, predicate: P) -> Option<usize>在迭代器中搜索元素,并返回其索引。
rpositionfn rposition<P>(&mut self, predicate: P) -> Option<usize>从右边搜索迭代器中的元素,并返回其索引。
maxfn max(self) -> Option<Self::Item>
minfn min(self) -> Option<Self::Item>
max_by_keyfn max_by_key<B: Ord, F>(self, f: F) -> Option<Self::Item>返回指定函数中给出最大值的元素。
max_byfn max_by<F>(self, compare: F) -> Option<Self::Item>返回相对于指定比较函数给出最大值的元素。
min_by_keyfn min_by_key<B: Ord, F>(self, f: F) -> Option<Self::Item>
min_byfn min_by<F>(self, compare: F) -> Option<Self::Item>
revfn rev(self) -> Rev<Self>反转迭代器的方向。
unzipfn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)将成对的迭代器转换为一对容器。
copied fn copied<'a, T: 'a>(self) -> Copied<Self>创建一个迭代器,复制它的所有元素。
clonedfn cloned<'a, T: 'a>(self) -> Cloned<Self>创建一个迭代器,[clone]复制它的所有元素。
cycle fn cycle(self) -> Cycle<Self>无休止地重复迭代器。
sumfn sum<S>(self) -> S
productfn product<P>(self) -> P迭代整个迭代器,将所有元素相乘。
cmpfn cmp<I>(self, other: I) -> Ordering从词典的角度比较这个迭代器和另一个迭代器的元素。
cmp_by fn cmp_by<I, F>(mut self, other: I, mut cmp: F) -> Ordering根据指定的比较函数,按字典顺序将该迭代器的元素与另一迭代器的元素进行比较。
partial_cmpfn partial_cmp<I>(self, other: I) -> Option<Ordering>从词典的角度比较这个迭代器和另一个迭代器的元素。
partial_cmp_byfn partial_cmp_by<I, F>(mut self, other: I, mut partial_cmp: F) -> Option<Ordering>根据指定的比较函数,按字典顺序将该迭代器的元素与另一迭代器的元素进行比较。
eqfn eq<I>(self, other: I) -> bool确定此迭代器的元素是否与其他迭代器的元素相等。
eq_byfn eq_by<I, F>(mut self, other: I, mut eq: F) -> bool确定此迭代器的元素相对于指定的相等函数是否与另一个迭代器的元素相等。
nefn ne<I>(self, other: I) -> bool确定此迭代器的元素是否与其他迭代器的元素不相等。
ltfn lt<I>(self, other: I) -> bool
lefn le<I>(self, other: I) -> bool
gtn gt<I>(self, other: I) -> bool
gefn ge<I>(self, other: I) -> bool
is_sortedfn is_sorted(self) -> bool
is_sorted_by fn is_sorted_by<F>(mut self, compare: F) -> bool
is_sorted_by_keyfn is_sorted_by_key<F, K>(self, f: F) -> bool
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust:官方迭代器大全 的相关文章

  • 关于51单片机的中断

    1 中断的要求 1 中断源有中断请求 Ask for instructions of the CPU interrupt request source called interrupt source 2 此中断源的中断允许位为1 The i
  • 华为机试_HJ5 进制转换【简单】

    描述 写出一个程序 xff0c 接受一个十六进制的数 xff0c 输出该数值的十进制表示 数据范围 xff1a 保证结果在 1 le n le 2 31 1 1 n 231 1 输入描述 xff1a 输入一个十六进制的数值字符串 输出描述
  • bootstrap实现 — 个人简介

    实现 xff1a bootstrap 效果图 xff1a 源码 xff1a lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt titl
  • 计蒜客--T1079--打表+控制输出

    假设有 N 盏灯 xff08 NN为不大于 5000 的正整数 xff09 xff0c 从 1 到 N 按顺序依次编号 xff0c 初始时全部处于开启状态 xff1b 有 M 个人 xff08 M 为不大于 N的正整数 xff09 也从 1
  • Authentication plugin ‘caching_sha2_password‘ 服务端也无法连接问题彻底解决

    在网上搜索了很多的帖子 xff0c 发现描述的都是外部客户端无法登录到mysql上 xff0c 登录上服务器以后连接更改配置的方式 xff0c 但是 xff01 xff01 xff01 xff01 xff01 我现在是服务器连接也报错啊啊啊
  • Hexo分类及标签显示

    Hexo根目录配置 config yml category map Blogs categories Blogs Tech categories Tech Tools categories Tools Other categories Ot
  • IDEA查看历史记录

    方法一 文件内 Ctrl 43 右键 Local History Show History xff0c 显示当前文件的本地修改历史 方法二 一 xff1a 在文件内 xff0c 按 Ctrl 43 Shift 43 A 弹出全部搜索对话框
  • SpringBoot-JPA整合ShardingShpere自定义分布式主键

    分布式主键简介 在分布式环境下 xff0c 由于分库分表导致数据水平拆分后无法使用单表自增主键 xff0c 因此我们需要一种全局唯一id生成策略作为分布式主键 当前有如下解决方案 UUID xff08 Universally Unique
  • Gitlab的安装与配置

    安装开始时 xff0c 需确认服务器最小配置是2核4G xff0c 因为gitlab软件比较大 1 配置yum源 xff1a vim etc yum repos d gitlab repo gitlab name 61 gitlab ce
  • Error creating bean with name ‘org.springframework.aop.aspectj.AspectJPointcutAdvisor#0

    问题 xff1a nested exception is org springframework beans factory BeanCreationException Error creating bean with name 39 or
  • Vue前端项目开发页面(二)

    前端界面开发 开发工具版本 64 vue cli 4 5 13 新建Login vue登陆页 1 在 vue exemples 项目 xff0c 选中components目录右键 New Vue Component xff0c 名称为 Lo
  • SpringBoot整合WebSocket

    概述 HTTP 协议是一种无状态的 无连接的 单向的应用层协议 它采用了请求 响应模型 通信请求只能由客户端发起 xff0c 服务端对请求做出应答处理 WebSocket和HTTP一样 xff0c 都是一种网络通信协议 比起HTTP只能由客
  • SpringBoot整合MybatisPlus使用IPage实现分页

    概述 MybatisPlus 提供了分页的功能 IPage内部原理是基于拦截器 xff0c 但是这个拦截的是方法以及方法中的参数 xff0c 这个也会判断是否是查询操作 如果是查询操作 xff0c 才会进入分页的处理逻辑 进入分页逻辑处理后
  • SpringBoot统一异常处理

    概述 SpringBoot 提供了 64 ControllerAdvice 64 RestControllerAdvice 注解可以实现统一异常处理 xff0c 只需要在定义异常类加上以上注解即可 自定义异常处理 定义统一异常处理 span
  • 萌新学习算法——并查集基础

    并查集 在算法设计中 xff0c 将一个集合和另外一个集合合并时 xff0c 就会用到并查集 假如不用并查集 xff0c 你可能会用到集合和列表来实现 xff0c 这样会使代码看起来很复杂 xff0c 而且执行效率不高 xff0c 下面用洛
  • linux中断及其底半部-s5p6818开发平台

    中断分为两个部分 xff1a 中断顶部 xff08 top half xff09 和中断底半部 xff08 bootom half xff09 一 中断顶部 xff08 top half xff09 中断上半部需要处理一下三种情况 xff1
  • Windows如何查看.db数据库文件

    从android应用导出的 db文件 xff0c 想在Windows电脑端看 xff0c 可以用SQLite Expert Professional这个软件查看 xff0c 网上说用FireFox的插件sqlite manager xff0
  • Ubuntu工具-01 UEX

    UltraEdit是Windows旗下一款流行的老牌文本 HEX编辑器 xff08 非开源 xff09 UltraEdit正被移植到Linux平台 该移植名为UEX xff0c 意即UltraEdit for Linux UltraEdit
  • Ubuntu工具-2 OBS Studio

    文章目录 1 下载并安装1 1 Flathub安装1 2 Snap安装1 3 PPA源方式安装1 3 1 检查OpenGL版本 xff0c 其版本必须高于 96 3 3 96 1 3 2 安装虚拟摄像机驱动1 3 3 安装ffmpeg库1
  • Docker build创建指定容器镜像

    Docker build xff1a Build an image from a Dockerfile 按照Dockerfile文件所定义内容创建临时性容器 xff0c 把Docker中所定义的每行命令在临时容器中执行 xff0c 然后生成

随机推荐

  • Ubuntu工具-03 VLC

    文章目录 1 安装VLC Media Player的方法1 1 apt安装1 2 snap安装 xff08 未测试 xff09 2 启动VLC Media Player并设置为默认媒体播放器 VLC Media Player xff08 V
  • MySQL笔记-07 常用函数

    文章目录 1 数学函数1 1 ABS1 2 CEIL和CEILIN1 3 FLOOR1 4 MOD1 5 ROUND1 6 TRUNCATE 2 字符串函数2 1 CONCAT2 2 CONCAT WS2 3 INSERT2 4 LOWER
  • SpringMVC-01 Web基础介绍

    文章目录 1 CGI1 1 CGI原理1 2 输入 出1 3 环境变量1 3 1 与请求相关的环境变量1 3 2 与服务器相关的环境变量1 3 3 与客户端相关的环境变量1 3 4 详细说明1 3 4 1 REQUEST METHOD 1
  • SpringMVC-02 MVC模式介绍

    文章目录 1 Java Web开发模型2 JSP 43 JavaBean开发模型 xff08 model1 xff09 3 MVC开发模式 xff08 model2 xff09 3 1 MVC模式基础3 1 1 模型 视图 控制器各部分的作
  • 系统架构师-科目1考点

  • 系统架构师-科目2考点

  • 系统架构师-科目3考点

  • Hive笔记-01 架构概述

    文章目录 1 概述2 Metadata Metastore的作用3 Metastore三种配置方式3 1 Hive配置参数说明3 1 1 基本配置参数3 1 2 其他配置参数 3 2 内嵌模式 xff08 Embedded xff09 3
  • Hadoop笔记-01概述

    文章目录 1 什么是大数据 xff1f 1 1 大数据计算模式及代表产品1 2 云计算与物联网1 2 1 云计算1 2 1 1 虚拟化1 2 1 2 分布式存储1 2 1 3 分布式计算1 2 1 4 多租户 1 3 物联网1 3 1 识别
  • Hadoop笔记-02 安装

    文章目录 1 VBOX安装CentOS71 1 安装VBOX软件1 2 下载CentOS7镜像文件1 3 初始化VBOX虚拟盘1 4 CentOS7网络配置1 5 CentOS7 yum源配置1 6 CentOS7 一般配置1 6 1关闭防
  • ffmpeg播放器实现详解 - 视频同步控制

    1 时间戳 时间戳的概念贯穿音视频开发始终 xff0c 重要性不言而喻 时间戳告诉我们在什么时候 xff0c 用多快的速度去播哪一帧 xff0c 其中 xff0c DTS decoding timestamp 告诉我们何时解码 xff0c
  • Ubuntu22.04 安装深度微信报错 依赖: libsasl2-2 (>= 2.1.27.1)

    现象 xff1a span class token punctuation span base span class token punctuation span pang 64 pang HP span class token funct
  • Ubuntu22.04更新后 点击深度微信无反应

    系统版本 xff1a Ubuntu 22 04 jammy内核 xff1a x86 64 Linux 5 15 0 53 genericdeepin wine6 stable 版本 xff1a 6 0 0 41 1 深度微信图标点击后 xf
  • MySQL笔记-08 索引

    文章目录 1 索引概述1 1 MySQL索引分类1 1 1 普通索引1 1 2 唯一性索引1 1 3 全文索引1 1 4 单列索引1 1 5 多列索引1 1 6 空间索引 2 创建索引2 1 在建立数据表时创建索引2 1 1 普通索引创建2
  • MySQL笔记-09 视图

    文章目录 1 视图概念1 1 概念1 2 作用 2 创建视图2 1 查看创建视图的权限2 2 创建视图的步骤2 3 创建视图的注意事项 3 视图操作3 1 查看视图3 1 1 DESCRIBE语句3 1 2 SHOW TABLE STATU
  • MySQL笔记-10 数据完整性约束

    文章目录 1 定义完整性约束1 1 实体完整性1 1 1 主键约束1 1 2 候选键约束 1 2 参照完整性1 3 用户定义完整性1 3 1 非空约束1 3 2 CHECK约束1 3 2 1 对列实施CHECK约束1 3 2 2 对表实施C
  • Linux命令行笔记-00 综述

    文章目录 1 Linux命令行简介1 1 Linux命令行的分类1 1 1 根据系统中作用来分类1 1 2 根据对象来分类 2 Linux命令行解释器2 1 命令行解释器shell2 1 1 核心程序2 1 2 公用程序shell2 1 3
  • Linux命令行笔记-01 文件管理-文件的建立、移动和删除

    文章目录 1 文件的建立 移动和删除1 1 96 cat 96 建立文件1 1 1 语法格式与参数1 1 2 示例 1 2 96 touch 96 建立文件1 2 1 语法格式与参数1 2 2 示例1 2 3 注意 1 3 96 ln 96
  • CMake学习-01 综述

    文章目录 1 CMake1 1 CMake生成makefile并编译的流程 2 CMakeLists txt2 1 Demo讲解2 2 常用命令2 2 1 指定CMAKE的最低版本2 2 2 设置项目名称2 2 3 设置变量2 2 4 设置
  • Rust:官方迭代器大全

    一 for 和迭代器 先看一段代码 xff1a span class token keyword fn span span class token function definition function main span span cl