当前位置: 首页 > news >正文

rust for循环里的所有权 - into_iter / iter / iter_mut

文章目录

  • 1 遍历对象实质为 .into_iter() 生成的迭代器
  • 2 避免转移 .iter() / .iter_mut()
  • 3 for循环里自变量为什么不用加mut

// for循环语法糖
for loop_variable in iterator {code()
}
// 解糖
{let result = match IntoIterator::into_iter(iterator) {mut iter => loop {match iter.next() {None => break,Some(loop_variable) => { code(); },};},};result
}

1 遍历对象实质为 .into_iter() 生成的迭代器

fn into_iter(self) -> Self::IntoIter
(注意:这里的IntoIter是关联类型,自定义的类型别名)
遍历未实现Copy trait的对象将发生所有权转移

let a = vec![0, 1]; // Vec未实现Copy trait
for i in a {i;}
// a; // 去掉注释;报错,a所有权转移

2 避免转移 .iter() / .iter_mut()

fn iter(&self) -> Iter
fn iter_mut(&mut self) -> IterMut
1)

let a = vec![0, 1]; 
for i in a.iter() {i;}
a; 

实际上,for循环可以遍历所有实现IntoIterator trait的对象,而IntoIterator trait必须实现的方法就是into_iter();
Iter和IterMut也都实现了IntoIterator trait,所以可以理解为上述代码解糖后操作的对象是a.iter().into_iter(),而基本库里Iter对象into_iter()方法实现是这样的:

impl<I: Iterator> IntoIterator for I {type Item = I::Item;type IntoIter = I; // 类型IntoIter就是待实现对象的类型,这里也就是Iter#[inline]fn into_iter(self) -> I {self // 将iter()产生的Iter对象原封不动地返回,但之前对象的所有权已经转移}
}

.into_iter()a.iter()原封不动地返回,此时for循环遍历的对象实质就是a.iter(),而.iter()传递的是调用者的引用

2)
另一种写法就是直接遍历对象的引用

    let a = vec![0, 1]; for i in &a {i;}a; 

不可变引用都实现了 Copy trait这里自然不存在所有权转移;
同时,【摘自文档 https://rustwiki.org/zh-CN/std/iter/index.html】如果集合类型 C 提供 iter(),则它通常还为 &C 实现 IntoIterator,而该实现只是调用 iter()。 同样,提供 iter_mut() 的集合 C 通常通过委派给 iter_mut() 来为 &mut C 实现 IntoIterator。
所以,这里实际上操作的对象还是a.iter()
p.s 方法的调用会自动解引用,故&a.iter()和a.iter()等价

3 for循环里自变量为什么不用加mut

从文章开头贴出的代码可以看到,解糖后的代码自变量loop_variable实际只是存在于单次循环中的一个临时变量,可以理解成每次循环都会完成一次let loop_variable = iter.next();的赋值操作, 所以,自变量无需mut也能发生变化;当然,添加了mut也不会报错,只是会多个警告提示。

相关文章:

rust for循环里的所有权 - into_iter / iter / iter_mut

文章目录 1 遍历对象实质为 .into_iter() 生成的迭代器2 避免转移 .iter() / .iter_mut()3 for循环里自变量为什么不用加mut // for循环语法糖 for loop_variable in iterator {code() } // 解糖 {let result match IntoIterator::into_iter(iterator) {mut iter > loop {m…...

GitHub README-Template.md - README.md 模板

GitHub README-Template.md - README.md 模板 1. README-Template.md 预览模式2. README-Template.md 编辑模式References A template to make good README.md. https://gist.github.com/PurpleBooth/109311bb0361f32d87a2 1. README-Template.md 预览模式 2. README-Templat…...

【文本到上下文 #6】Word2Vec、GloVe 和 FastText

一、说明 欢迎来到“文本到上下文”博客的第 6 个系列。到目前为止&#xff0c;我们已经探索了自然语言处理的基础知识、应用和挑战。我们深入研究了标记化、文本清理、停用词、词干提取、词形还原、词性标记和命名实体识别。我们的探索包括文本表示技术&#xff0c;如词袋、TF…...

yolov5 opencv dnn部署自己的模型

yolov5 opencv dnn部署自己的模型 github开源代码地址使用github源码结合自己导出的onnx模型推理自己的视频推理条件c部署c 推理结果 github开源代码地址 yolov5官网还提供的dnn、tensorrt推理链接本人使用的opencv c github代码,代码作者非本人&#xff0c;也是上面作者推荐的…...

Cortex-M4处理器 电源管理

Cortex-M4处理器的休眠模式可以降低功耗。 模式可以是以下一种或两种&#xff1a; 休眠模式停止处理器时钟深度睡眠模式停止系统时钟&#xff0c;关闭锁相环和闪存。 如果设备实现了两种提供不同级别省电的睡眠模式&#xff0c;那么SCR的SLEEPDEEP位将选择使用哪种睡眠模式。…...

Linux 驱动开发基础知识——编写LED驱动程序(三)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…...

YOLOv8 视频识别

YOLOv8 是一种目标检测算法&#xff0c;用于识别视频中的物体。要控制视频识别中的帧&#xff0c;可以通过以下方式来实现&#xff1a; 设置帧率&#xff1a;可以通过设置视频的帧率来控制视频的播放速度&#xff0c;从而影响视频识别的速度。 跳帧处理&#xff1a;可以通过跳…...

elementplus Dialog 对话框设置距离页面顶部的距离

默认为 15vh&#xff0c;当弹窗过于高的时候&#xff0c;这个距离其实是不合适的 <el-dialogv-model"dialogVisible"title"Tips"width"30%":before-close"handleClose"top"6vh"><span>This is a message</s…...

便捷接口调测:API 开发工具大比拼 | 开源专题 No.62

hoppscotch/hoppscotch Stars: 56.1k License: MIT Hoppscotch 是一个开源的 API 开发生态系统&#xff0c;主要功能包括发送请求和获取实时响应。该项目具有以下核心优势&#xff1a; 轻量级&#xff1a;采用简约的 UI 设计。快速&#xff1a;实时发送请求并获得响应。支持多…...

openssl3.2/test/certs - 008 - root-nonca trust variants: +serverAuth +anyEKU

文章目录 openssl3.2/test/certs - 008 - root-nonca trust variants: serverAuth anyEKU概述笔记END openssl3.2/test/certs - 008 - root-nonca trust variants: serverAuth anyEKU 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 // \file my_openssl_win_log_doc…...

cg插画设计行业怎么样,如何学习插画设计

插画设计行业是一个充满创意和艺术性的行业&#xff0c;随着数字化时代的不断发展&#xff0c;cg插画的应用范围越来越广泛&#xff0c;市场需求也在逐年增长。以下是一些关于acg插画设计行业的现状和发展趋势&#xff1a; 市场需求不断增长&#xff1a;随着广告、媒体、影视、…...

1.25学习总结

今天学习了二叉树&#xff0c;了解了二叉树的创建和遍历的过程 今天所了解的遍历过程主要分为三种&#xff0c;前序中序和后序&#xff0c;都是DFS的想法 前序遍历&#xff1a;先输出在遍历左节点和右节点&#xff08;输出->左->右&#xff09; 中序遍历&#xff1a;先…...

C语言每日一题(48)回文链表

力扣 234 回文链表 题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1…...

提高代码效率的5个Python内存优化技巧

大家好&#xff0c;当项目变得越来越大时&#xff0c;有效地管理计算资源是一个不可避免的需求。Python与C或c等低级语言相比&#xff0c;似乎不够节省内存。 但是其实有许多方法可以显著优化Python程序的内存使用&#xff0c;这些方法可能在实际应用中并没有人注意&#xff0…...

基于一款热门大屏可视化设计器使用教程

乐吾乐大屏可视化设计器是一个用于创建和定制大屏幕数据可视化展示的工具&#xff0c;支持零代码实现物联网、工业智能制造等领域的可视化大屏、触摸屏端UI以及工控可视化的解决方案。同时也是一个Web组态工具&#xff0c;支持2D、3D等多种形式&#xff0c;用于构建具有实时数据…...

梯度下降法、模拟训练、拟合二次曲线、最小二乘法、MSELoss、拟合:f(x)=ax^2+bx+c

本文目标&#xff1a; 以这个公式为例&#xff0c;设计一个算法&#xff0c;用梯度下降法来模拟训练过程&#xff0c;最终得出参数a,b,c 原理介绍 目标函数&#xff1a; 损失函数&#xff1a;&#xff0c;就是mse 损失函数展开&#xff1a; 损失函数对a,b,c求导数: 导数就是梯度…...

Web3.0投票如何做到公平公正且不泄露个人隐私

在当前的数字时代&#xff0c;社交平台举办投票活动已成为了一种普遍现象。然而&#xff0c;随之而来的是一些隐私和安全方面的顾虑&#xff0c;特别是关于个人信息泄露和电话骚扰的问题。期望建立一个既公平公正又能保护个人隐私的投票系统。Web3.0的出现为实现这一目标提供了…...

灰度图像的自动阈值分割

第一种&#xff1a;Otsu &#xff08;大津法&#xff09; 一、基于cv2的API调用 1、代码实现 直接给出相关代码&#xff1a; import cv2 import matplotlib.pylab as pltpath r"D:\Desktop\00aa\1.png" img cv2.imread(path, 0)def main2():ret, thresh1 cv2.…...

利用Maven获取jar包

我有一个习惯&#xff0c;就是程序不在线依赖网络的任何包。以前用C#时候虽然用Nuget找包&#xff0c;但是添加引用后又马上把Nuget引用删了&#xff0c;再把Nuget下载的dll拷贝到工程再引用dll。 这样做的好处是&#xff1a; 1.别人得到程序代码可以直接编译&#xff0c;不用…...

将vue组件发布成npm包

文章目录 前言一、环境准备1.首先最基本的需要安装nodejs&#xff0c;版本推荐 v10 以上&#xff0c;因为需要安装vue-cli2.安装vue-cli 二、初始化项目1.构建项目2.开发组件/加入组件3. 修改配置文件 三、调试1、执行打包命令2、发布本地连接包3、测试项目 四、发布使用1、注册…...

veil:专为AI智能体设计的无头浏览器自动化工具

1. 项目概述&#xff1a;为AI智能体打造的“隐形之手”如果你正在构建或使用AI智能体&#xff0c;并且希望它能像真人一样操作浏览器——登录社交平台、发布内容、浏览网页、点击按钮——那么你很可能已经感受到了传统自动化工具的掣肘。Selenium、Puppeteer这些工具很棒&#…...

Tempera风格在Midjourney中为何始终不达标?:资深提示工程专家拆解v6.1/v6.2渲染底层逻辑

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Tempera风格在Midjourney中的定义性困境 Tempera&#xff08;蛋彩画&#xff09;作为一种古老绘画媒介&#xff0c;其细腻笔触、哑光质感与矿物颜料特有的微颗粒反光&#xff0c;在Midjourney等文本到图…...

ComfyUI视频处理终极指南:3步搭建AI视频生成工作流

ComfyUI视频处理终极指南&#xff1a;3步搭建AI视频生成工作流 【免费下载链接】ComfyUI-VideoHelperSuite Nodes related to video workflows 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-VideoHelperSuite 在AI图像生成领域&#xff0c;ComfyUI以其强大的节…...

别再死记公式了!用Python+NumPy手撸一个卡尔曼滤波器(附代码详解)

用PythonNumPy从零实现卡尔曼滤波器&#xff1a;原理剖析与调参实战 卡尔曼滤波器这个听起来高大上的算法&#xff0c;其实离我们并不遥远。想象一下你在玩一个无人机航拍游戏&#xff0c;屏幕上的无人机位置总是飘忽不定——GPS信号有延迟&#xff0c;惯性传感器有漂移&#…...

通用AGI终极范式:从多模态感知到意识涌现的统一理论(世毫九实验室原创研究)

通用AGI终极范式&#xff1a;从多模态感知到意识涌现的统一理论作者&#xff1a;方见华单位&#xff1a;世毫九实验室摘要本研究基于世毫九理论体系的数学框架&#xff0c;构建了通用人工智能&#xff08;AGI&#xff09;的完整理论体系和演化路径。通过建立包含拓扑复杂度、动…...

城市道路自动驾驶避障规划与MPC跟踪控制【附仿真】

✨ 长期致力于自动驾驶、路径规划、速度规划、跟踪控制、模型预测控制研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;SL图五次多项式代价路径决策与凸…...

LaTeX引用中文文献总出乱码?可能是你BibTeX引擎和编码没选对(XeLaTeX+BibTeX实战)

LaTeX中文文献引用乱码全解析&#xff1a;从编码原理到XeLaTeX实战方案 当你熬夜赶论文时&#xff0c;参考文献列表突然变成一堆乱码方块&#xff0c;引用标记全部显示为"??"——这种崩溃瞬间&#xff0c;每个用LaTeX写过中文论文的人都经历过。传统解决方案往往停…...

sdd-riper:专业磁盘镜像工具在数据恢复中的原理与实践

1. 项目概述与核心价值最近在整理一些老旧存储设备时&#xff0c;遇到了一个挺典型的问题&#xff1a;手头有几块年代久远的硬盘&#xff0c;里面可能还存着一些早年间的照片、文档&#xff0c;但硬盘本身已经不太稳定&#xff0c;系统里能识别&#xff0c;但拷贝文件时动不动就…...

淘宝淘金币自动化脚本终极指南:每天节省20分钟,彻底解放双手

淘宝淘金币自动化脚本终极指南&#xff1a;每天节省20分钟&#xff0c;彻底解放双手 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本&#xff0c;包含蚂蚁森林收取能量&#xff0c;芭芭农场全任务&#xff0c;解放你的双手 项目地址: https://gitcode.com/gh_mirrors/ta/t…...

从‘Hello World’到打开PRT文件:一个完整的NX C++外部exe开发入门实战(VS2015 + NX12)

从‘Hello World’到打开PRT文件&#xff1a;一个完整的NX C外部exe开发入门实战&#xff08;VS2015 NX12&#xff09; 在工业设计领域&#xff0c;NX&#xff08;原Unigraphics&#xff09;作为一款功能强大的CAD/CAM/CAE软件&#xff0c;其二次开发能力为工程师提供了极大的…...