一文弄懂rust生命周期

 更新时间:2023年12月07日 15:07:19   作者:int8  
生命周期是Rust语言中的一个概念,用于决内存安全问题,本文主要介绍了一文弄懂rust生命周期,具有一定的参考价值,感兴趣的可以了解一下

一、生命期是什么

生命期,又叫生存期,就是变量的有效期。
实例1

{
    let r;
    {
        let x = 5;
        r = &x;
    }
    println!("r: {}", r);
}

编译错误,原因是r所引用的值已经被释放。

在这里插入图片描述

上图中的绿色范围’a表示r的生命期,蓝色范围’b表示x的生命期。

实例2

fn longer(s1: &String, s2: &String) -> &String {
    if s2.len() > s1.len() {
        s2
    } else {
        s1
    }
}
fn main() {
    let r;
    {
         let s1 = "rust".to_string();
         let s2 = "ecmascript".to_string();
         r = longer(&s1, &s2);
    }
    println!("{} is longer", r);
}

longer函数取s1和s2两个字符串较长的一个返回其引用值。但这段代码不会通过编译,原因是最后使用r的时候,s1和s2都已经失效了。虽然可以把r的使用移到s1和s2的生命期以内避免错误,但对于函数来说,它并不知道调用者如何使用它,所以为了保障自己传递出去的值始终是可使用的,就要消除一切危险,直接不能通过编译。

所以下面代码编译错误

fn longer(s1: &String, s2: &String) -> &String {
    if s2.len() > s1.len() {
        s2
    } else {
        s1
    }
}
fn main() {
    let r;
    {
         let s1 = "rust".to_string();
         let s2 = "ecmascript".to_string();
         r = longer(&s1, &s2);
        println!("{} is longer", r);
    }
}

二、标明生命期

虽然生命期的含义是变量的有效期,但其实只应用于引用。
一些场景,必须显式标明引用的生命期。
标明生命期,并不是改变引用的有效期,只是显式告诉编译器引用的有效期。悬垂引用的问题还存在,还需要程序员自己处理。

(一)生命期注释是标明引用生命期的办法。

语法格式:
用单引号开头,跟着生命期名字:

&i32 // 常规引用
&'lifea i32 // 含有生命期注释的引用
&'lifeb mut i32 // 含有生命期注释的可变引用

(二)特殊生命期

'static

'static表示的生命期是从程序运行开始到程序运行结束。
所有字符串字面量都是 &'static str

三、使用生命期

(一)函数中使用生命期

改造longer函数:

fn longer<'a>(s1: &'a String, s2: &'a String) -> &'a String {
    if s2.len() > s1.len() {
        s2
    } else {
        s1
    }
}
fn main() {
    let r;
    {
         let s1 = "rust".to_string();
         let s2 = "ecmascript".to_string();
         r = longer(&s1, &s2);
        println!("{} is longer", r);
    }
}

我们把生命期作为泛型参数,标明函数返回值的生命期与两个参数的生命期是一样的,这样就能编译通过了。意思是只要返回值和参数的生命期一样时,就能使用longer函数。

(二)结构体中使用生命期

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

方法定义
impl<'a> Str<'a> {
    fn get_content(&self) -> &str {
        self.content
    }
}

这里返回值并没有标明生命期,但是加上也无妨。这是一个历史问题,早期Rust不支持生命期自动判断,所有的生命期必须严格声明,但现在的Rust已经支持了。

到此这篇关于一文弄懂rust生命周期的文章就介绍到这了,更多相关rust生命周期内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vscode搭建rust开发环境的图文教程

    vscode搭建rust开发环境的图文教程

    Rust 是一种系统编程语言,它专注于内存安全、并发和性能,本文主要介绍了vscode搭建rust开发环境的图文教程,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 2022最新Rust变量与数据类型讲解

    2022最新Rust变量与数据类型讲解

    rust 是强类型语言所有变量、常量都必须有明确的数据类型,这篇文章主要介绍了Rust变量与数据类型,需要的朋友可以参考下
    2022-11-11
  • rust中的match表达式使用详解

    rust中的match表达式使用详解

    在rust中提供了一个极为强大的控制流运算符match,这篇文章主要介绍了rust中的match表达式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Rust中vector的详细用法

    Rust中vector的详细用法

    Rust和C++同样也有vector概念,本文主要介绍了Rust中vector的详细用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • Rust中不可变变量与const的区别详解

    Rust中不可变变量与const的区别详解

    Rust作者认为变量默认应该是immutable,即声明后不能被改变的变量,这一点是让跨语言学习者觉得很别扭,不过这一点小的改变带来了诸多好处,本节我们来学习Rust中不可变变量与const的区别,需要的朋友可以参考下
    2024-02-02
  • 一文详解Rust中的错误处理

    一文详解Rust中的错误处理

    这篇文章主要为大家详细介绍了Rust中的错误处理的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • rust多样化错误处理(从零学习)

    rust多样化错误处理(从零学习)

    一个优秀的项目,错误处理的优雅性是至关重要的,而rust,anyhow creat是绕不过去的一个,今天我们来研究下,怎么使用它,帮助我们写出更优雅的代码,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2023-11-11
  • Rust HashMap详解及单词统计示例用法详解

    Rust HashMap详解及单词统计示例用法详解

    HashMap在Rust中是一个强大的工具,通过合理使用可以简化很多与键值对相关的问题,在实际开发中,我们可以充分利用其特性,提高代码的效率和可读性,本文将深入介绍HashMap的特性,以及通过一个单词统计的例子展示其用法,感兴趣的朋友一起看看吧
    2024-02-02
  • Rust 入门之函数和注释实例详解

    Rust 入门之函数和注释实例详解

    这篇文章主要为大家介绍了Rust 入门之函数和注释实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Rust声明宏在不同K线bar类型中的应用小结

    Rust声明宏在不同K线bar类型中的应用小结

    在K线bar中,往往有很多不同分时k线图,比如1,2,3,5,,,,,60,120,250,300…,,不同分钟类型,如果不用宏,那么手写会比较麻烦,下面就试用一下宏来实现不同类型的bar,感兴趣的朋友一起看看吧
    2024-05-05

最新评论