Rust:生命周期的主要作用是避免悬垂引用

60 阅读2分钟

题外话(学习心得):学习一个新事物,在这里讲的就是在学习Rust语言上面,遇到新知识点。对于我来说最好的方式是:先了解它究竟是干嘛的?为了解决什么问题而存在! 其次是基本的使用方法!再次是其扩展知识。

有了以上思路:

1、为什么有生命周期? -> Rust生命周期存在的主要作用就是避免悬垂引用。

之前学习所有权机制的时候,了解过悬垂指针,就是在所有权发生变化的时候,指针指向的值被释放掉以后,程序还返回了这个指针,当然这是不被允许的,所以会报错,只是这种情况有一个描述它的名字叫悬垂指针罢了。为了编码阶段避免出现悬垂状态,rust使用借用检查器和生命周期来共同解决这个问题。

为了保证 Rust 的所有权和借用的正确性,Rust 使用了一个借用检查器(Borrow checker),来检查程序的借用正确性。

也就是说借用检查器是为了防止悬垂引用而设计的机制,在所有权系统和生命周期标注共同作用下,使得在编译期就能检测出潜在的悬垂引用问题。

2、怎么使用?-> 生命周期标注

1)、??为什么要标注?

在存在多个引用时,编译器有时会无法自动推导生命周期,此时就需要我们手动去标注,通过为参数标注合适的生命周期来帮助编译器进行借用检查的分析。

2)、用法

生命周期的语法也颇为与众不同,以 ' 开头,名称往往是一个单独的小写字母,大多数人都用 'a 来作为生命周期的名称。 如果是引用类型的参数,那么生命周期会位于引用符号 & 之后,并用一个空格来将生命周期和引用参数分隔开:

&i32        // 一个引用
&'a i32     // 具有显式生命周期的引用
&'a mut i32 // 具有显式生命周期的可变引用

和泛型一样,使用生命周期参数,需要先声明 <'a>

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

有了以上对生命周期的基本认识,学习起来就变得清晰明了了,当然这只是我个人的学习经验仅此分享。我个人的理解可能偏于复杂了,更多的一手知识点在# Rust语言圣经(Rust Course)中。