rust - 生命周期学习与引用有效性

news/2024/10/29 2:40:30/

通过对《Rust 程序设计语言》,《通过例子学 Rust 中文版》以及令狐一冲老师对相关知识点的学习总结而成。

rust - 生命周期学习

  • 1 生命周期避免了悬垂引用
  • 2 借用检查器
  • 3 函数中的泛型生命周期

1 生命周期避免了悬垂引用

生命周期的主要目标是避免悬垂引用,它会导致程序引用了非预期引用的数据。

{					/***************** a ****************/let r;			/* r的生命周期自从该处定义开始, 到整个a生命周期结束 */{				/***************** b *****************/let x = 5;	/* 从x 定义到生命周期b结束为x的生命周期 */r = &x;}				/* 在该处x被调用drop方法释放,r对x的引用成为悬垂引用 */println!("r: {}", r);
}

运行之后会提示如下的错误:

rlk@rlk:lifetime$ cargo run Compiling lifetime v0.1.0 (/home/rlk/work/learn_rust/lifetime)
error[E0597]: `x` does not live long enough--> src/main.rs:7:13|
7  |         r = &x;|             ^^ borrowed value does not live long enough
8  |     }|     - `x` dropped here while still borrowed
9  |
10 |     println!("r = {}", r);|                        - borrow later used hereFor more information about this error, try `rustc --explain E0597`.
error: could not compile `lifetime` due to previous error
rlk@rlk:lifetime

如上面的错误所指出的,x的生命周期不够长,但是r对x的引用却还一直存在,最终导致了悬垂引用。

2 借用检查器

Rust 编译器有一个 借用检查器(borrow checker),它比较作用域来确保所有的借用都是有效的。
下面是上面的例子,但是更清晰的标注了r和x的生命周期

{let r;                // ---------+-- 'a//          |{                     //          |let x = 5;        // -+-- 'b  |r = &x;           //  |       |}                     // -+       |//          |println!("r: {}", r); //          |
}                         // ---------+

将上面的例子修改为如下所示就可以正常编译运行通过,

{let x = 5;            // ----------+-- 'b//           |let r = &x;           // --+-- 'a  |//   |       |println!("r: {}", r); //   |       |// --+       |
} 

x的生命周期比r长,并且包括了r的生命周期,所以r可以正确的去引用x,当这段代码结束的时候,x和r都会通过drop方法被释放掉,所以也就不会产生悬垂引用的问题。

3 函数中的泛型生命周期

下面我们要实现一个返回两个字符串较长字符串的处理函数。

fn longest(x: &str, y: &str) -> &str {if x.len() > y.len() {x} else {y}
}

http://www.ppmy.cn/news/4802.html

相关文章

万字解析,带你深入掌握多种排序算法!-C语言

今天我们来看排序,排序在生活中经常使用,非常重要,是必学的内容。 目录 1.插入排序 1.1直接插入排序 1.2希尔排序 2.选择排序 2.1直接选择排序 2.2堆排序 3.交换排序 3.1冒泡排序 3.2快速排序 3.2.1挖坑法 3.2.2左右指针法 3.2.3…

我的周刊(第070期)

我的信息周刊,记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。🎯 项目streamlit[1]用 Python 快速构建数据应用&#xff1…

【大数据趋势】趋势在发生变化,稍安勿躁。

昔日(12月以前)行情核心源头 : 纳斯达克指数主连日线,趋势预测准确,继续筑底可能中 回顾一下上周大数据预测的趋势,指数用上引线方式神奇完成目标 【12.3趋势模拟情况】 预计:趋势不变情况下,预测反弹到黄金分割线…

基于Java毕业设计校园小区互助系统源码+系统+mysql+lw文档+部署软件

基于Java毕业设计校园小区互助系统源码系统mysqllw文档部署软件 基于Java毕业设计校园小区互助系统源码系统mysqllw文档部署软件本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开发软件:idea eclipse 前端技术&#xff1…

Android 11 静默安装和静默卸载

修改记录 1.安装器 //Installer.java package com.kte.interfacesettings.service; import java.io.IOException; import java.io.InputStream; import android.content.Context; import android.content.Intent; import android.util.Log; import android.content.pm.IPacka…

安全智能分析

超参数调优 定义内涵 在机器学习的上下文中,超参数是在开始学习过程之前设置值的参数,在神经网络训练 过程中不会发生改变。通常情况下,在机器学习过程中需要对超参数进行优化,给学习器选 择一组最优超参数,以提高学…

linux基础学习-基本命令

基本命令 拷贝和移动 tree[目录名]:以树状图列出文件目录结构 -d:只显示目录cp 源文件 目标文件:复制文件或者目录 -f:已存在的目标文件直接覆盖,不会提示-i:覆盖文件前提示-r:若给出的源文件是…

【JVM】本地方法栈与堆与方法区

文章目录1. 本地方法栈2. 堆3. 方法区1. 本地方法栈 本地方法栈和虚拟机栈有点类似,均具有线程隔离的特点以及都能抛出StackOverflowError和OutOfMemoryError异常。 但是不同之处在于本地方法栈服务的对象是JVM执行的native方法,而虚拟机栈服务的是JVM…