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

RUST 每日一省:生命周期作用域

生命周期

        一个变量的生命周期就是它从创建到销毁的整个过程。

作用域
        我们声明的每个变量都有作用域。作用域其实是变量和值存在的环境。作用域是由一对花括号表示的。例如,使用块表达式会创建一个作用域,即任何以花括号开头和结尾的表达式。此外,作用域支持互相嵌套,并且可以在子作用域中访问父作用域的元素,但反过来不行。

{let a = "hello";    ----------+-- a的作用域let b = 1;          -----+--b |{                        |    |let c = true;   ---+--c  |    ||     |    |---+     |    |}                        |    |---------+    |--------------+
}

        当作用域结束时,作用域内定义的变量都会运行相关代码以释放资源。对于在堆栈上分配的数据,可以轻松地判定变量是否存续。对在堆上分配的值, drop 方法会被放在作用域结束标记}之前调用。但这里是隐式的,可以避免程序员忘记释放值。 drop 方法来自 Drop 特征,它是为 Rust 中大部分堆分配类型实现的,可以轻松地自动释放资源。

生命周期&作用域

        Rust的生命周期是基于作用域的,我们可以认为变量的生命周期就是其作用域; 编译器能自动识别作用域内这些变量的生命周期,方便进行管理。其实生命周期纯粹是一个编译期构造,它可以帮助编译器确定某个引用有效的作用域,并确保它遵循借用规则。它可以跟踪诸如引用的来源,以及它们是否比借用值生命周期更长这类事情。Rust 中的生命周期能够确保引用的存续时间不超过它指向的值。生命周期并不是作为开发人员要用到的,而是编译器使用和推断引用的有效性时会用到的。

{let a = "hello";    ----------+-- a生命周期let b = 1;          -----+--b |{                        |    |let c = true;   ---+--c  |    ||     |    |---+     |    |}                        |    |---------+    |--------------+
}

所有权的转移 

        由于变量会在作用域结束时,会自动释放。如果我们需要在其作用域外继续使用它,要么转移所有权, 要么按位复制,就可以继续使用, 这取决于该变量是复制语义还是移动语义的。

        如果有其他变量进入了作用域,也是会发生所有权的变化;要么转移所有权, 要么按位复制, 这取决于该变量是复制语义还是移动语义的。

{let a = "hello".to_string();     let b = 1;   let c_out;  let d_out;        {                         let c_in = 2;  let d_in = "world".to_string();                    a;b;c_out = c_in;d_out = d_in;}     //println!("a:{}",a);     println!("b:{}",b);   println!("c_out:{}",c_out);//println!("c_in:{}",c_in);//println!("d_in:{}",d_in);   println!("d_out:{}",d_out);   
}b:1
c_out:2
d_out:world

        如果我们要把打印a的注释去掉,就会产生如下错误,a进入子作用域之后,发生所有权转移,在自作用结束的时候,释放了a,所以我们继续使用就会报错了。

 去掉c_in的打印,则会产生如下错误,c_in也是如此。

创建新的作用域

  • 可以使用块表达式(花括号)创建作用域。
{let a = "hello".to_string();     let b = 1;   let c_out;  let d_out;        {                         let c_in = 2;  let d_in = "world".to_string();                    a;b;c_out = c_in;d_out = d_in;}     //println!("a:{}",a);     println!("b:{}",b);   println!("c_out:{}",c_out);//println!("c_in:{}",c_in);//println!("d_in:{}",d_in);   println!("d_out:{}",d_out);   
}
  • match匹配也会产生一个作用域。
  • for、 loop以及while循环语句均可以创建新的作用域。
  • if let块和while let块也会创建新的作用域。

        这三者都是类似,我们以match为例,演示一下。如果t换成是Some(6),就没有问题,因为t是Option<i32>,具有复制语义了。

fn main(){let t = Some("test".to_string());match t{Some(v) => (),None => (),}//println!("t:{}",t);
}

去掉注释之后,报错如下,说明t已经在Some(v)=> ()发生了所有权的转移,然后在作用域结束时被释放掉了;

  • 函数体本身是独立的作用域。

由于String是移动语义,当它作为参数传入f函数后,发生了所有权转移,如果在main函数中再次调用就会发生错误。

fn f(t:String){println!("{:?}",t);
}
fn main(){let t = Some("test".to_string());f(t);//println!("{:?}",t);
}

  • 闭包

闭包会创建新的作用域, 对于环境变量来说有以下三种捕获方式:
· 对于复制语义类型, 以不可变引用(&T) 来捕获。
· 对于移动语义类型, 执行移动语义(move) 转移所有权来捕获。
· 对于可变绑定, 如果在闭包中包含对其进行修改的操作, 则以可变引用(&mut) 来捕获。


fn main(){let t = Some("test".to_string());let c = |i: i32|{//println!("{:?},{:?}",t,i);t;};c(0);//println!("{:?}",t);
}

这里还有一个比较有意思的地方,就是println!("{:?},{:?}",t,i);如果在闭包里只有这一句;没有t; 则不会发生所有权的转移;即println不发生所有权的转移,他表面调用的时候t,实际的参数&t;

相关文章:

RUST 每日一省:生命周期作用域

生命周期 一个变量的生命周期就是它从创建到销毁的整个过程。 作用域 我们声明的每个变量都有作用域。作用域其实是变量和值存在的环境。作用域是由一对花括号表示的。例如&#xff0c;使用块表达式会创建一个作用域&#xff0c;即任何以花括号开头和结尾的表达式。此…...

【过程8】——能量守恒视角总结感受

一、背景 另一个角度的看到&#xff0c;观望着过程中自己曾经类似的经历(小舅子的工作)。 时间久了&#xff0c;经历多了&#xff0c;感悟会更加的充实&#xff1b;最近自己对于人在维持能量的过程中也有很多的感悟&#xff0c;一并做一下总结 二、过程 1.人为什么天性不愿意…...

kong(4):限流配置

Kong 提供了 Rate Limiting 插件&#xff0c;实现对请求的限流功能&#xff0c;避免过大的请求量过大&#xff0c;将后端服务打挂。 Rate Limiting 支持秒/分/小时/日/月/年多种时间维度的限流&#xff0c;并且可以组合使用。例如说&#xff1a;限制每秒最 多 100 次请求&…...

人脸识别 Face Recognition 入门

人脸识别 Face Recognition 入门概述 总述传统特征方法深度学习方法损失函数改进基于欧几里德和距离的损失基于角度/余弦边距的损失SoftMax 损失及其变体 一级标题二级标题二级标题二级标题 找论文搭配 Sci-Hub 食用更佳 &#x1f4aa; Sci-Hub 实时更新 : https://tool.yovisu…...

【AI绘画】Midjourney的使用及程序示例

Midjourney 1.背景2.Midjourney的原理3.Midjourney的使用方法4.Midjourney的示例代码 1.背景 Midjourney 是一款基于深度学习的图像转换工具&#xff0c;其可以将一张图像转换成具有不同风格的图像&#xff0c;例如将一张照片转换成卡通风格的图像。Midjourney 基于 TensorFlow…...

无公网IP?教你在外远程访问本地wamp服务器「内网穿透」

目录 前言 1.Wamp服务器搭建 1.1 Wamp下载和安装 1.2 Wamp网页测试 2. Cpolar内网穿透的安装和注册 2.1 本地网页发布 2.2 Cpolar云端设置 2.3 Cpolar本地设置 3. 公网访问测试 4. 结语 前言 软件技术的发展日新月异&#xff0c;各种能方便我们生活、工作和娱乐的新…...

leetcode 628. 三个数的最大乘积

题目描述解题思路执行结果 leetcode 628. 三个数的最大乘积 题目描述 三个数的最大乘积 给你一个整型数组 nums &#xff0c;在数组中找出由三个数组成的最大乘积&#xff0c;并输出这个乘积。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;6 示例 2&…...

fork函数如何创建进程,exit/_exit函数如何使进程终止的详细分析与代码实现

&#x1f38a;【进程通信与并发】专题正在持续更新中&#xff0c;进程&#xff0c;线程&#xff0c;IPC&#xff0c;线程池等的创建原理与运用✨&#xff0c;欢迎大家前往订阅本专题&#xff0c;获取更多详细信息哦&#x1f38f;&#x1f38f;&#x1f38f; &#x1fa94;本系列…...

重置电脑时提示“缺少所需的驱动器分区”怎么办?

当您启动Windows 10电脑并收到“您的电脑/设备需修复”这个消息提示时&#xff0c;您会马上尝试修复电脑&#xff0c;如果您这样做了&#xff0c;您可能会收到一个“安装Windows的驱动器已被锁定”的信息。如果您尝试重置您的电脑&#xff0c;您可能会收到一条提示&#xff0c;…...

在KylinV10安装Dm8

前言 因为近期&#xff0c;业外和几个朋友想搞点有趣的项目玩玩&#xff0c;既然不以盈利为主&#xff0c;就> 主推国产化&#xff0c;所以这篇记录一下&#xff0c;我在KylinV10安装dm8.最近真的很忙&#xff0c;要负责专研一下国产化工具开发的事&#xff0c;还要负责tb级…...

「SQL面试题库」 No_46 交换工资

&#x1f345; 1、专栏介绍 「SQL面试题库」是由 不是西红柿 发起&#xff0c;全员免费参与的SQL学习活动。我每天发布1道SQL面试真题&#xff0c;从简单到困难&#xff0c;涵盖所有SQL知识点&#xff0c;我敢保证只要做完这100道题&#xff0c;不仅能轻松搞定面试&#xff0…...

SLAM论文速递【SLAM—— RDS-SLAM:基于语义分割方法的实时动态SLAM—4.24(1)

论文信息 题目&#xff1a; RDS-SLAM:Real-Time Dynamic SLAM Using Semantic Segmentation Methods RDS-SLAM:基于语义分割方法的实时动态SLAM论文地址&#xff1a; https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber9318990发表期刊&#xff1a; IEEE Access ( Volum…...

OJ练习第82题——填充书架

填充书架 力扣链接&#xff1a;1105. 填充书架 题目描述 给定一个数组 books &#xff0c;其中 books[i] [thicknessi, heighti] 表示第 i 本书的厚度和高度。你也会得到一个整数 shelfWidth 。 按顺序 将这些书摆放到总宽度为 shelfWidth 的书架上。 先选几本书放在书架…...

OHOS IDE和SDK的安装方法

参照OpenHarmony应用开发环境安装流程&#xff0c;下载安装OHOS的IDE&#xff0c;过程中需要全程联网。 IDE&#xff0c;安装至D:\Tools\Huawei\DevEcoStudio。 IDE安装成功之后&#xff0c;按照提示下载安装HOS和OHOS的SDK。 nodejs&#xff0c;安装至D:\Tools\Huawei\nodejs…...

New Year Garland(计数类DP)

New Year Garland 题意 ​ 用m种颜色的球装饰n层的圣诞树&#xff0c;圣诞树的第i层由 l i l_{i} li​个彩球串成&#xff0c;且同一层相邻的球颜色不同&#xff0c;相邻的层之间彩球颜色的集合不同&#xff0c;问有多少种方案&#xff0c;对p取模。 分析 ​ 首先先计算每一…...

32岁阿里P7,把简历改成不知名小公司,学历改成普通本科,工作内容不变,投简历全挂!...

hr靠什么来招人&#xff1f; 一位猎头讲述了自己和朋友打赌的故事&#xff1a; 朋友在阿里云&#xff0c;32岁&#xff0c;P7&#xff0c;他把简历上的公司改成不知名&#xff0c;学历改成普通本科&#xff0c;工作内容不变&#xff0c;结果投其他公司&#xff08;比如京东&…...

从三室心脏MRI影像检测主动脉瓣病变

Detecting Aortic Valve Pathology from the 3-Chamber Cine Cardiac MRI View 摘要 背景 心脏磁共振(CMR)是量化心脏容量、功能和血流量的金标准。定制的MR脉冲序列定义了对比机制&#xff0c;采集几何形状和定时&#xff0c;可以在CMR期间应用&#xff0c;以实现独特的组织…...

【JavaWeb】JavaScript

1、JavaScript 介绍 Javascript 语言诞生主要是完成页面的数据验证。因此它运行在客户端&#xff0c;需要运行浏览器来解析执行 JavaScript 代码。 JS 是 Netscape 网景公司的产品&#xff0c;最早取名为 LiveScript;为了吸引更多 java 程序员。更名为 JavaScript。 JS 是弱…...

Apache Doris 1.2.4 Release 版本正式发布|版本通告

亲爱的社区小伙伴们&#xff0c;我们很高兴地宣布&#xff0c;Apache Doris 于 2023 年 4 月 27 日迎来 1.2.4 Release 版本的正式发布&#xff01;在 1.2.4 版本中&#xff0c;Doris 团队已经修复了自 1.2.3 版本发布以来近 150 个问题或性能改进项。同时&#xff0c;1.2.4 版…...

【C++STL】map

文章目录 一. map的介绍二. map的使用结束语 一. map的介绍 map是关联容器&#xff0c;它按照特定的次序&#xff08;按照key来比较&#xff09;存储由键值key和值value组合而成的元素在map中&#xff0c;键值key通常用于排序和唯一地标识元素&#xff0c;而value中存储与此键值…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...