【Rust】14. Rust 中的函数式语言功能:迭代器与闭包

news2024/11/20 23:32:24

14.1 闭包:捕获环境的匿名函数

在这里插入图片描述

14.1.1 闭包会捕获其环境

在这里插入图片描述
在这里插入图片描述

14.1.2 闭包类型推断和注解

  • 闭包并不总是要求像 fn 函数那样在参数和返回值上注明类型
  • 闭包通常很短,并只关联于小范围的上下文而非任意情境
  • 如果尝试对同一闭包使用不同类型则就会得到类型错误!

在这里插入图片描述
在这里插入图片描述

14.1.3 捕获引用或者移动所有权

  • 闭包可以有3种参数捕获方式:1、不可变借用;2、可变借用;3、获取所有权
  • 对于不可变借用:可多处使用(如:打印)
  • 对于可变借用:在闭包定义和调用之间不能有不可变引用来使用(如:打印)!
  • 对于获取所有权:可使用 move 关键字来强制闭包获取它用到的环境中值的所有权

在这里插入图片描述
在这里插入图片描述

14.1.4 将被捕获的值移出闭包和 Fn trait

  • 闭包可以做3种事:1、将一个捕获的值移出闭包;2、修改捕获的值,但不移出闭包;3、既不移动也不修改值,或者一开始就不从环境中捕获值。与之对应的,闭包取决于应用场景可以实现下面3种 trait(可同时实现多个 trait
  • FnOnce适用于能被调用一次的闭包,所有闭包都至少实现了这个 trait,因为所有闭包都能被调用。一个会将捕获的值移出闭包体的闭包只实现 FnOnce trait,这是因为它只能被调用一次比如:xxx_vec.push(value) 将会移出 value 的所有权给到闭包外部的向量 xxx_vec,因此该闭包就会被实现为一个 FnOnce 闭包
  • FnMut适用于不会将捕获的值移出闭包体的闭包,但它可能会修改被捕获的值。这类闭包可以被调用多次(==闭包内部可以做一些其他的计算操作 或者说 修改值,但这些操作不能返回值 或者说 不能将值移出闭包体,比如示例13-9所示的操作:num_sort_operations += 1; ==)
  • Fn适用于既不将被捕获的值移出闭包体也不修改被捕获的值的闭包,当然也包括不从环境中捕获值的闭包。这类闭包可以被调用多次而不改变它们的环境,这在会多次并发调用闭包的场景中十分重要
  • 注意:上面这些 trait 会根据代码的实现方式来自动对应!!!

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

14.2 迭代器:处理元素序列

14.2.1 Rust 的迭代器

  • 在 Rust 中,迭代器是 惰性的(lazy),这意味着在调用方法使用迭代器之前它都不会有效果

在这里插入图片描述

14.2.2 Iterator trait 和 next 方法

  • Iterator trait 要求同时定义一个 Item 类型,这个 Item 类型被用作 next 方法的返回值类型
  • 迭代器的消费(重要概念):在迭代器上调用 next 方法改变了迭代器中用来记录序列位置的状态,每调用一次 next 都会从迭代器中消费(去掉)一个项
  • iter:调用中得到的值是不可变引用
  • iter_mut:调用中得到的值是可变引用
  • into_iter:获取所有权并返回拥有所有权的迭代器

在这里插入图片描述

14.2.3 消费适配器:调用 next 方法会消费迭代器

  • 迭代器的消费(重要概念):在迭代器上调用 next 方法改变了迭代器中用来记录序列位置的状态,每调用一次 next 都会从迭代器中消费(去掉)一个项
  • 调用 next 方法的方法被称为 消费适配器(consuming adaptors),因为调用这些方法会获取迭代器的所有权并反复调用 next 来遍历迭代器(也就是会消耗迭代器)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

14.2.4 迭代适配器:改变迭代器类型

  • Iterator trait 中定义了另一类方法,被称为 迭代器适配器(iterator adaptors),他们不消耗迭代器,而是将当前迭代器变为不同功能的迭代器(如:通过 map 方法来转换一个迭代器)
  • 可以链式调用多个迭代器适配器。不过因为所有的迭代器都是惰性的,必须调用一个消费适配器方法以便获取迭代器适配器调用的结果(如:collect() 方法)!

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

14.2.5 使用闭包来获取上下文环境

  • filter:判断一个使用迭代器的每一个项并返回布尔值的闭包,如果闭包返回 true,其值将会包含在 filter 提供的新迭代器中。如果闭包返回 false,其值不会包含在结果迭代器中

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

14.2.6 实现 Iterator trait 来创建自定义迭代器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

14.3 改进 I/O 项目

14.3.1 使用迭代器并去掉 clone

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

14.3.2 使用迭代适配器来使代码更简明

在这里插入图片描述

14.4 性能对比:循环 VS 迭代器

在这里插入图片描述
在这里插入图片描述

14.5 小结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/191131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

selenium自动化测试框架

一、Selenium自动化测试(基于python) 1、Selenium简介: 1.1 Selenium是一款主要用于Web应用程序自动化测试的工具集合。Selenium测试直接运行在浏览器中,本质是通过驱动浏览器,模拟浏览器的操作,比如跳转…

测试碎碎念(基础篇_2)

一、软件测试的基础概念1.1 需求在企业中,需求 主要分为 用户需求 和 软件需求~用户需求:可以简单理解为甲方提出的需求,如果没有甲方,那么就是终端用户使用产品时必须要完成的任务;用户需求 一般是比较简略的&#xf…

Flink官方例子解析:带窗口的WordCount

1. 简介 本篇介绍的是带窗口的WordCount,使用窗口函数countWindow。 countWindow是一种计数窗口,有固定窗口和滑动窗口两种用法。 1.1 固定窗口 countWindow(windowSize) , windowSize指的是窗口大小。 例如countWindow(5), 说明一个窗口可…

零基础机器学习做游戏辅助第七课--模型的保存与加载

一、保存模型 当我们训练好模型后将它保存下来,这样下次使用时就可以直接加载模型进行工作了。 常见的保存模型有三种: 只保存权重文件:model.save_weights(num_weights) 当我们使用save_weights保存权重文件时,没有指定后缀名,则会保存三个文件在指定目录下

linux 下ARC的中断机制

linux 下ARC的中断机制 一、Idu 中断控制器初始化 Idu 是arc 处理器内部中断控制模块, 类似于arm 内部的gic 中断控制模块 首先,Idu中断控制器在初始化时, 会解析DTS信息中定义了几个idu控制器,每个Idu控制器注册一个struct irq_domain数据…

嵌入式Linux系统开发笔记(十三)

U-Boot烧写验证测试 正点原子专门编写了一个软件来将编译出来的.bin 文件烧写到 SD 卡中,这个软件叫做“imxdownload” 【1】将 imxdownload 拷贝到工程根目录下 【2】给予 imxdownload 可执行权限 我们直接将软件 imxdownload 从 Windows 下复制到 Ubuntu 中以…

【干货】Windows下cmd中cd命令的使用方法

【干货】Windows下cmd中cd命令的使用方法什么是cd命令cd命令的使用打开cmdcd命令的常用方法进入某个盘进入某个目录返回上一级目录返回至当前工作目录下的根目录参考什么是cd命令 此处介绍两个概念: cmd:命令提示符cd:全称change directory…

model.train()与model.val()

一、问题描述 需要将mmpose框架下训练的模型单独保存出来,做后续处理。用torch.save()直接保存模型mmpose_model.pt,然后重新搭建模型,把保存的模型参数加载进去,得到scratch_model.pt使用scratch_model.pt进行推理,与…

基于Jmeter的百万级tps性能测试实践

【CSDN 编者按】如何对系统的承载能力和响应时间做出准确的评估,为资源的合理配置及优化提供依据,性能测试就成了必不可少的测试手段,本文会给读者推荐一款业界占有率最高的一款性能测试工具——Jmeter。 本文作者朱凯是环信测试主管&#x…

TCP实现回显服务器及客户端

目录 前言: Socket API SeverSocket API TCP中的长短连接 TCP实现回显服务器 代码实现(有详细解释) TCP实现回显客户端 代码实现(有详细注释) 小结: 前言: 上篇文章介绍了TCP的特点。由…

195136-58-4,2‘,7‘-Difluorofluorescein,2,7-二氟荧光素

产品描述:2,7-二氟荧光素中Fluorescein (Uranine) 生物应用中的荧光示踪剂,Fluorescein (Uranine) 是一种具有代表性的绿色荧光团,已被广泛用作实用绿色荧光探针的支架。结构式:理论分析:中文名&#xff1a…

1608_PC汇编语言_first例程分析

全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 这一次的笔记主要是梳理一个例程以及部分辅助信息。 为什么要学习汇编语言呢?现在的高级语言开发效率高,而且有着不错的效率,是…

Compose之跨平台Activity页面

前言 Compose(Jetpackjb)是可以跨平台的 目前跨平台主流的页面导航方式一般有两种 一种是都在同一个页面内进行页面替换类型的导航,类似于单Activity,多Fragment 另一种是不同的页面在不同的页面载体上,类似多Activity 两种页面导航方式都可以使用,但我比较偏向于使用多Ac…

加密签名算法

序言如果我们要消费的一段字符串没有唯一标识,我们该如何防止重复消费.cuiyaonan2000163.com背景信息加密加密技术是最常用的安全保密手段,利用技术手段把重要的数据变为乱码(加密)传送,到达目的地后再用相同或不同的手段还原&…

【虚拟仿真】Unity3D中实现鼠标悬浮模型上显示文字

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 在仿真项目开发中,会遇到让鼠标悬浮模型后显示模型…

《流浪地球2》MOSS出圈,现实中的量子计算机长啥样?

科技云报道原创。 春节档科幻电影《流浪地球2》上映后,影片中被誉为“全场最有价值道具”的智能量子计算机MOSS(代号550W)火了! 如果你看完了片尾彩蛋,会发现MOSS或许是整个流浪地球系列电影中的最大反派&#xff0c…

支持向量机-数学模型

支持向量机(support vector machines, SVM)是一种二分类模型。基本模型是定义在特征空间上的间隔最大的线性分类器;学习策略:间隔最大化;学习算法:求解凸二次规划的最优化算法。 支持向量机分为线性可分支…

自动驾驶感知——激光雷达基本概念|激光雷达点云|激光雷达的标定

文章目录1. 激光雷达基本概念1.1 激光雷达特点1.2 激光雷达测距原理1.2.1 系统组成1.2.2 激光雷达测距原理1.3 常见的激光雷达1.3.1 机械旋转式激光雷达1.3.2 Velodyne HDL-64E1.3.3 固态激光雷达1.3.4 Flash型固态激光雷达1.3.5 相控阵固态激光雷达1.3.6 MEMS型固态激光雷达1.…

NX二开ufun函数UF_MODL_create_surf_from_cloud(使用现有点创建B曲面)

本节主要讲使用现有点创建B曲面的ufun函数UF_MODL_create_surf_from_cloud,这些点可以按任何顺序出现,但是必须有足够的点来定义平面。 先看实例效果图: 1、函数结构 int UF_MODL_create_surf_from_cloud ( int point_cnt&#…

双栏Latex模板插入多个图片的各种排布

目录 问题描述: 问题解决: 1. 插入一个图片 示意图如下: 2.插入2x1两个图片:2x1 示意图如下: 3. 插入1x2两个图片:1x2 示意图如下: 4.插入2x2两个图片:2x2 示意图如下&…