rust闭包

rust闭包

参考

Rust有三个闭包trait:Fn、FnMut和FnOnce编译器会根据闭包内代码的行为自动为闭包实现这些trait。

上面这段话超级重要!!!

  1. 对于不可变或移动捕获变量的闭包,编译器会实现Fn trait,这样闭包可以多次调用,甚至可以在多个线程上并行调用
  2. 对于可变捕获变量但不移动它们出闭包的闭包,编译器会实现FnMut trait,这样的闭包可以多次调用,但不能并行调用
  3. 对于会移动捕获变量出闭包的闭包,编译器会实现FnOnce trait,这样的闭包只能调用一次。注意move关键字不影响trait实现,它只是强制移动变量进入闭包

Fn trait是FnMut的子trait,FnMut trait是FnOnce的子trait。这意味着:

  1. 每个实现Fn trait的闭包也实现了FnMut和FnOnce。任何需要FnMut或FnOnce的地方,都可以传递实现Fn的闭包。
  2. 每个实现FnMut trait的闭包也实现了FnOnce。任何需要FnOnce的地方都可以传递实现FnMut的闭包。

如果被调用者接受FnOnce,它对闭包能做的事情受到最大限制——它只能调用闭包一次。但是调用者可以自由传递任何闭包,因为所有的闭包都实现了FnOnce,这是由子trait和父trait的关系决定的。

如果被调用者接受FnMut,那么它对闭包的限制会少一些。现在它可以调用闭包多次,但是仍然不能例如在多个线程上并发地调用闭包,因为那会导致数据共用。相应的,调用者也会受到更多的限制。例如,它不能在闭包中drop一个被捕获的变量或以其他方式将其移出闭包。

最后,如果被调用者接受Fn,那么它可以无限制的调用闭包,甚至并发调用。与此同时,调用者不能改变闭包中的变量。
在这里插入图片描述

最后附上一个学习闭包过程中,关于函数调用不可变String作为形参可变String的例子。

  let a = "fox".to_string();
  let add1=&a;
  println!("{:p}",add1);  // 打印变量的地址
  let b = test1(a);
  println!("{:?}",b);
  println!("{:p}",&b);

}

fn test1(mut s : String)-> String{
  let add2 = &s;
  println!("{:p}",add2);
  s.push_str("123");
  s
}

PS D:\code\rust\test_demo> cargo run
   Compiling test_demo v0.1.0 (D:\code\rust\test_demo)
    Finished dev [unoptimized + debuginfo] target(s) in 2.51s
     Running `target\debug\test_demo.exe`
0x119a6ff3a8
0x119a6ff420
"fox123"    
0x119a6ff408

  let a = "fox".to_string();
  let add1=&a;
  println!("{:p}",add1);  // 打印变量的地址
  let b = test1(a);
  println!("{:?}",b);
  println!("{:p}",&b);

}

fn test1(s : String)-> String{
  let add2 = &s;
  println!("{:p}",add2);
  // s.push_str("123");
  s
}

PS D:\code\rust\test_demo> cargo run
   Compiling test_demo v0.1.0 (D:\code\rust\test_demo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.42s
     Running `target\debug\test_demo.exe`
0x8758aff458
0x8758aff4d0
"fox"       
0x8758aff4b8

实际上a是不可变string,但是test1函数可以捕获a的所有权,然后重新给了一个新的变量s,s是可变的。打印地址可以看出他们的地址都不相同。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三维模型几何坐标精度偏差应采用主要措施

三维模型几何坐标精度偏差应采用主要措施 降低倾斜摄影三维模型几何精度偏差是提高模型质量和准确性的关键任务。下面将浅谈降低倾斜摄影三维模型几何精度偏差应采用的主要措施。 1、倾斜角度选择:倾斜角度对于几何精度具有重要影响。选择适当的倾斜角度可以优化视…

项目管理之如何监控项目健康状态

项目管理是一个复杂且关键的过程,涉及到多个关键因素,包括项目名称、项目管理委员会成员、项目经理、项目生命周期的各个阶段以及资源泳道等。如何有效地监控项目的健康状态是确保项目成功的重要环节。本文将详细介绍项目管理全景图及其在风险识别中的应…

JAVA二叉搜索树(专门用来查找)

目录 二叉搜索树又叫二叉排序树,它具有以下特征 二次搜索树的效率 模拟最简二叉搜索树代码 代码片段分析 查找二叉搜索树数据: 如果我们用递归的方法查找数据有什么不一样? 插入数据 删除数据(难点) 二叉搜索树又叫二叉排序树,它具有以下特征…

C++ day3作业

1> 思维导图 2> 自己封装一个矩形类(Rect),拥有私有属性:宽度(width)、高度(height), 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void s…

【EMD】1.初识经验模态分解EMD

/*** poject 经验模态分解及其衍生算法的研究及其在语音信号处理中的应用* author jUicE_g2R(qq:3406291309)* * language MATLAB/Python/C/C* EDA Base on matlabR2022b* editor Obsidian(黑曜石笔记软件)* * copyright 2023* …

LED点阵显示原理(取字模软件+Keil+Proteus)

前言 写这个的时候我还是有点生气的,因为发现完全按照书上面的步骤来,结果发现不理想,后面还是自己调试才解决了。-_-说多了都是泪,直接进入正文。 软件的操作还是参考我之前的博客。 LED数码管的静态显示与动态显示&#xff0…

nssm将exe应用封装成windows服务

一、简介 NSSM(Non-Sucking Service Manager)是一个用于在Windows操作系统上管理和运行应用程序作为服务的工具。它提供了一种简单的方法来将任意可执行文件转换为Windows服务,并提供了一些额外的功能和配置选项。 优点: 简单易…

ifream标签中的子页面,操作父页面的元素

问题描述&#xff1a;子页面内容发生变化时&#xff0c;导航栏不会跟切换 解决办法&#xff1a; window.parent.document.getElementById demo html1 <html> <head><meta charset"UTF-8"><!-- import CSS --><link rel"stylesh…

一站式解决方案:体验亚马逊轻量服务器/VPS的顶级服务与灵活性

文章目录 一、什么是轻量级服务器/VPS 二、服务器创建步骤 三、服务器连接客户端(私钥登录) 四、使用服务器搭建博客网站 五、个人浅解及总结 一、什么是轻量级服务器/VPS 亚马逊推出的轻量级服务器/VPS&#xff1a;是一种基于云计算技术的虚拟服务器解决方案。它允许用户…

Spring Boot 整合SpringSecurity和JWT和Redis实现统一鉴权认证

&#x1f4d1;前言 本文主要讲了Spring Security文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&#xff1a;努力…

XShelll-修改快捷键-xftp-修改编辑器

文章目录 1.XShelll-修改快捷键2.Xftp-修改文本编辑器3.总结 1.XShelll-修改快捷键 工具>选项 鼠标键盘&#xff0c;右键编辑&#xff0c;新建快捷键。 复制粘贴改成shiftc,shiftv。更习惯一些。 2.Xftp-修改文本编辑器 xftp修改服务器文件默认的编辑器&#xff0c;是记…

重新思考边缘负载均衡

本文介绍了Netflix在基于轮询的负载均衡的基础上&#xff0c;集成了包括服务器使用率在内的多因素指标&#xff0c;并对冷启动服务器进行了特殊处理&#xff0c;从而优化了负载均衡逻辑&#xff0c;提升了整体业务性能。原文: Rethinking Netflix’s Edge Load Balancing[1] 我…

2023李宏毅机器学习HW05样例代码中文注释版

这里只是 2023 李宏毅机器学习 HW05 样例代码的中文注释版的分享&#xff0c;下面的内容绝大部分是样例代码&#xff0c;补充了小部分函数的功能解释&#xff0c;没有做函数功能上的修改&#xff0c;是 Simple baseline 版本。 notebook 代码下载: [EN] [ZH] 文章目录 作业描述…

lazarus:数据集快速导出为excel、csv、sql及其他多种格式

lazarus被成为快速开发工具&#xff0c;为什么说“快速”&#xff0c;重要的一点是&#xff0c;很多工具是现成的&#xff0c;可以拿来直接就用。比如数据导出&#xff0c;如果需要把数据集导出为excel格式文件&#xff0c;写代码可能需要很多时间。lazarus就不用了&#xff0c…

微信小程序文件上传wx.uploadFile

网页版查看了一下负载要求是这样 wx.uploadFile({url: ${wx.getStorageSync(apiUrl)}//sysFileInfo/upload?token${wx.getStorageSync(token)}, // 仅为示例&#xff0c;非真实的接口地址filePath: files[0].url,name: file,formData: {secretFlag: Y },success: (res) > {…

Jakarta-JVM篇

文章目录 一.前言1. 1 JVM-堆常用调参1.2 JVM-方法区常用参数1.3 JVM-codeCache 二.JVM内存结构三. 对象创建四. JVM垃圾回收算法4.1 可达性分析算法4.1.1 对象引用4.1.2 回收方法区. 4.2 分代回收4.3 标记清除4.4 标记复制4.5 标记整理 五.垃圾回收器5.1 根节点枚举5.2 安全点…

XSAN数据恢复-存储空间架构迁移时误格式化存储系统的XSAN数据恢复案例

XSAN数据恢复环境&#xff1a; 昆腾存储&#xff0c;MAC OS操作系统&#xff0c;存放视频类数据&#xff08;MXF、MOV等格式文件&#xff09;。 XSAN故障&检测&#xff1a; 将存储空间从XSAN架构迁移到STORNEXT架构后&#xff0c;存储空间中数据全部丢失。 故障存储中一共…

JsonPath 数据快速查找和提取工具

常用语法 表达式说明$表示根元素$.key选择根元素下的指定键名的值$.*选择根元素下的所有属性值$.array[*]选择根元素中的数组的所有元素$.key[subkey]选择根元素中的键名为key&#xff0c;子键名为subkey的值$.key[*].subkey选择根元素中的键名为key的所有元素的子键名为subke…

软件测试/测试开发丨如何利用ChatGPT自动生成测试用例思维导图

点此获取更多相关资料 简介 思维导图是一种用图形方式表示思维和概念之间关系的工具&#xff1a; 有些公司会使用思维导图编写测试用例&#xff0c;这样做的优点是&#xff1a; 1.可视化和结构化。 2.易于理解&#xff0c;提高效率。 而 ChatGPT 是无法直接生成 xmind 格式…

基于单片机的超声波测距仪

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、本课题研究的主要内容二、超声波测距仪的整体方案2.2 超声波测距仪设计原理 三、超声波测距仪系统硬件电路的设计3.1 超声波测距仪的基本结构 四、 超声波测距仪系统的软件设计4.1 主程序软件设计仿真 五、结…