Rust语言从入门到入坑——(9)Rust 生命周期

news2024/12/23 11:40:39

文章目录

  • 0、引入
  • 1、生命周期注释
  • 2、结构体中使用字符串切片引用
  • 3、静态生命周期
  • 4、泛型、特性与生命周期协同作战
  • 5、总结


在这里插入图片描述

0、引入

Rust 生命周期机制是与所有权机制同等重要的资源管理机制,之所以引入这个概念主要是应对复杂类型系统中资源管理的问题。

引用是对待复杂类型时必不可少的机制,毕竟复杂类型的数据不能被处理器轻易地复制和计算。但引用往往导致极其复杂的资源管理问题,首先认识一下垂悬引用(在Rust所有权文章提到这个概念):

    let r;
    {
        let x = 5;
        r = &x;
    }   //出来这个范围,其实X已经被释放,所以r就是垂悬引用
        //引用必须在值的生命周期以内才有效。
    println!("r: {}", r);

再看一个函数的例子:

//定义一个函数,注意函数参数使用的是引用
fn longer(s1: &str, s2: &str) -> &str {
    if s2.len() > s1.len() {
        s2
    } else {
        s1
    }
}

fn main() {
    let r;
    {
        let s1 = "rust";
        let s2 = "ecmascript";
        r = longer(s1, s2);
    }
    println!("{} is longer", r);
}
//上述的例子是编译不通过,因为但 r 被使用的时候源值 s1 和 s2 都已经失效了
//改为 String就可以
fn longer(s1: String, s2: String) -> &str {
    if s2.len() > s1.len() {
        s2
    } else {
        s1
    }
}



1、生命周期注释

  • 生命周期注释是描述引用生命周期的办法。
  • 虽然这样并不能够改变引用的生命周期,但可以在合适的地方声明两个引用的生命周期一致。
  • 生命周期注释用单引号开头,跟着一个小写字母单词。
    如下所示
&i32        // 常规引用
&'a i32     // 含有生命周期注释的引用
&'a mut i32 // 可变型含有生命周期注释的引用

改写上述代码:

//注意我们需要用泛型声明来规范生命周期的名称
fn longer<'a>(s1: &'a str, s2: &'a str) -> &'a str {
    if s2.len() > s1.len() {
        s2
    } else {
        s1
    }
}

fn main() {
    let r;
    {
        let s1 = "rust";
        let s2 = "ecmascript";
        r = longer(s1, s2);
        println!("{} is longer", r);
    }
}

运行结果:ecmascript is longer


2、结构体中使用字符串切片引用

代码如下(示例):

fn main() {
    struct Str<'a> {
        content: &'a str
    }
    let s = Str {
        content: "string_slice"
    };
    println!("s.content = {}", s.content);
}

运行结果:s.content = string_slice


3、静态生命周期

  • 生命周期注释有一个特别的:'static ;
  • 所有用双引号包括的字符串常量所代表的精确数据类型都是 &'static str ,'static
    所表示的生命周期从程序运行开始到程序运行结束。

4、泛型、特性与生命周期协同作战

感受一下下面的程序,是不是蒙蔽,哈哈,早晚用上,现在可以不理解,只要眼熟就行。

use std::fmt::Display;

fn longest_with_an_announcement<'a, T>(x: &'a str, y: &'a str, ann: T) -> &'a str
    where T: Display
{
    println!("Announcement! {}", ann);
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

5、总结

Rust的生命周期其实和所有权有着关系,变量在超过表示的范围就会自动释放,不管你是在堆或者栈上都帮你主动释放,所以在写程序的时候要注意。


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

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

相关文章

【云原生丶Docker】DockerFile完全指南

DockerFile构建过程 DockerFile 是Docker的一个配置文件&#xff0c;本质上来说它只是一个文本文件&#xff0c;它是用来构建Docker镜像的。DockerFile配置文件中包含了一系列的指令和配置信息&#xff0c;用于描述如何构建镜像以及如何运行容器。通过编写 Dockerfile&#xf…

【c++11】新的类功能和可变参数包

c11 新增默认成员函数类成员变量初始化关键字defaultdelete 委托构造 可变参数包递归展开参数包逗号表达式展开参数包 结语 新增默认成员函数 原来c类中&#xff0c;有6个默认成员函数&#xff1a; 构造函数析构函数拷贝构造函数拷贝赋值重载取地址函数const 取地址重载 默认…

将mp4视频推流rtsp,并转为http直播流,在前端显示

最近有个需求&#xff0c;在vue页面的video组件播放直播流&#xff0c;本来想用flv.js&#xff0c;但是必须要flv格式才行&#xff0c;所以还是用原生video播放http直播流。 1. 将本地mp4推流rtsp 下载并解压EasyDarwin&#xff0c;双击EasyDarwin.exe运行&#xff0c;在控制…

【python】web应用开发DRF框架

DRF 【python】web应用开发DRF框架 Django rest_framework, 简称 drf, 可以更方便的使用django写出符合 RESTful 规范的接口, (缩减编写api接口的代码) Django REST framework是一个建立在Django基础之上的Web应用开发框架(Django的一个app)&#xff0c;可以快速的开发REST A…

【IMX6ULL驱动开发学习】12.Linux驱动之设备树

承接上一篇博客 【IMX6ULL驱动开发学习】11.驱动设计之面向对象_分层思想&#xff08;学习设备树过渡部分&#xff09; 代码获取&#xff1a;https://gitee.com/chenshao777/imx6-ull_-drivers 我后面将三个层合并了&#xff08;实际上只有前两层&#xff09;&#xff0c;合并…

【Java入门】注释、关键字、常量、变量、数据类型

注释&#xff1a; 作用 : 可以记录代码所实现的功能&#xff0c;方便程序员或代码编写者阅读代码以及方便他人更好理解代码 注释分类&#xff1a; 单行注释 格式&#xff1a; //注释信息多行注释 格式&#xff1a; /注释信息/文档煮熟 格式&#xff1a;/** 注释信息*/ /***…

TCP的socket API

1、核心类 ServerSocket &#xff1a;服务器使用的socket Socket : 服务器和客户端都会使用的socket accept进行的工作是拉客 对应操作系统来说&#xff0c;建立TCP连接是内核的工作 accept要干的就是等连接建立好了&#xff0c;把这个连接给拿到应用程序中。 如果当前连接…

chatgpt赋能python:Python获取文件后缀名

Python获取文件后缀名 在Python编程中&#xff0c;经常需要获取文件的后缀名&#xff0c;例如在处理文件上传、下载、压缩等操作时&#xff0c;需要对文件后缀名进行判断和处理。本文将介绍Python获取文件后缀名的两种常用方法。 方法一&#xff1a;使用split()函数 Python的…

【C语言初阶(2)】循环语句:while 循环

文章目录 1. while 语句介绍1.1 语法结构1.2 while 语句执行的流程 2. while 语句中的 break 和 continue2.1 break 介绍2.2 continue 介绍 我们已经掌握了 if 语句&#xff0c;当条件满足的情况下&#xff0c;if 语句的后的语句执行&#xff0c;反之不执行&#xff1b; 但是 i…

ChatGPT最新版多功能批量写作工具激发创作的无限可能

随着科技的不断发展&#xff0c;人工智能逐渐渗透到各个领域&#xff0c;其中包括写作领域。近年来&#xff0c;OpenAI推出的ChatGPT最新版多功能批量写作工具&#xff0c;为写作者们带来了全新的创作体验。这一工具不仅能够帮助写作者提高工作效率&#xff0c;还能够激发创作的…

chatgpt赋能python:Python获取定位的SEO指南

Python获取定位的SEO指南 什么是SEO SEO&#xff0c;即搜索引擎优化&#xff0c;是通过对网站进行优化&#xff0c;提高排名&#xff0c;从而增加搜索引擎来的流量&#xff0c;并达到提高转化率的目的。在这个数字时代&#xff0c;对于大多数网站来说&#xff0c;SEO已经成为…

idea maven 中模块显示灰色,依赖不加载

idea maven 中模块显示灰色&#xff0c;依赖刷新了几次都无法加载引入 后面发现是被MAVEN设置忽略了 去掉忽略文件然后reimport &#xff0c;就正常了

通过cifar-10数据集理解numpy数组的高(H)、宽(W)、通道数(C)

文章目录 1、CIFAR-10数据集介绍1.1 CIFAR-10数据集的构成1.2 batches.meta1.3 data_batch_n.py & test_batch.py 2、获取一张图片的data数据2.1 反序列化获得numpy数据2.2 清楚numpy中的H、W、C的含义2.3 清楚RGB图片在numpy中的表示 3、处理图片数据的代码 1、CIFAR-10数…

IDEA启动报错:Process finished with exit code 0

问题 SpringBoot项目启动后自动关闭 方案一 在pom中添加spring-boot-starter-web依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId> </dependency>方案二 在pom中…

CodeTON Round 5 (Div. 1 + Div. 2, Rated, Prizes!) A-D

1842A - Tenzing and Tsondu 题意 丁真和珍珠宝可梦对决, 每个宝可梦都有x战力, 假设有两个宝可梦, 其战力分别为a和b(a>b), 战力为a的宝可梦获胜后战力-b, 而战败的宝可梦会消失 最后还有宝可梦的人获胜 问你丁真和珍珠谁赢了 题解 显而易见, 赢下来的宝可梦可以继续打…

GcWord 6.1.4 Crack -GrapeCity Documents for Word

用于 Microsoft Word 文档的 .NET 6 API 通过代码完全控制您的 Word 文档&#xff0c;而不依赖于 Microsoft Word。 生成、加载、编辑和保存 Word 文档 基于 Microsoft Office API 的功能丰富的对象模型 从头开始或使用生成报告 报告模板 兼容多种平台&#xff0c;例如 Window…

vue-cli2 碎碎念念

vue create 和 vue init webpack 的区别&#xff1a; https://blog.csdn.net/qq_45955152/article/details/123506724 https://blog.csdn.net/qq_22182989/article/details/103611934 区别1&#xff1a; 区别2&#xff1a; 实践&#xff1a;

CadLib 4.0.2023.31601 net for Windows Crack

CadLib 4.0 for Windows&#xff1a;在 C# VB .NET 中读取、写入和显示 AutoCAD DWG 和 DXF 文件 CadLib 4.0 for Windows仅在Windows上运行&#xff0c;并且基于.NET 4.x。 CadLib 4.0读取、写入和显示 C#、VB.NET 或任何其他 .NET 语言的 AutoCAD™ DWG 和 DXF 文件。下载试…

Selenium教程__浏览器窗口大小(6)

本文将介绍如何使用Selenium来获取和设置浏览器窗口的大小&#xff0c;以及一些实际应用场景。 学习本文内容将能够轻松地控制浏览器窗口的大小&#xff0c;从而更好地适应不同的屏幕分辨率和设备&#xff0c;并确保网页在各种窗口大小下都能够良好地展示。 import time fro…

机器学习(二)逻辑回归

Logistic Regression 虽然被称为回归&#xff0c;但其实际上是分类模型&#xff0c;并常用于二分类。 Logistic 回归的本质是&#xff1a;假设数据服从这个分布&#xff0c;然后使用极大似然估计做参数的估计。 逻辑回归API介绍 sklearn.linear_model.LogisticRegression(sol…