Rust开发——Rust生命周期

一.概念

1.Rust的每个引用都有自己的生命周期,生命周期是为了保持引用在有效的作用域内,大多数情况下,生命周期是隐式可被推断的,当引用的生命周期可能以不同方式互相关联时,才要手动标注其生命周期。
2.一个变量的生命周期是在它创建的时候开始,在它销毁的时候结束。当通过&来借用一个变量时。该借用拥有一个生命周期,这个生命周期由变量声明的位置决定的,只要该借用在出借者被销毁前结束,借用就是有效的。然而,借用的作用域则是由使用引用的位置决定。
3.生命周期的主要目标是为了避免悬垂引用(在可以操作指针的编程语言中常常出现一种情况,一个指针还存在,但是指针指向的内存已经被释放)。

二.示例

1.Rust是通过借用检查器比较作用域来判断所有的借用是否合法。

fn main() 
{
    let i;//i的作用域是从这里开始到最后的花括号前结束
    {
        let x = 10;//x的作用域是从这里开始到当前大括号结束
        i = &x;//把x的引用赋给了i
        println!("i = {}",i);//此时i还在x的作用域内,输出是没有问题的
    }
}

这里IDE会对比两个变量的作用域来判断借用是否合法,当变量i借用了一个生命周期比自己要短的变量时

fn main() 
{
    let i;//i的作用域是从这里开始到最后的花括号前结束
    {
        let x = 10;//x的作用域是从这里开始到当前大括号结束
        i = &x;//把x的引用赋给了i
        //println!("i = {}",i);//此时i还在x的作用域内,输出是没有问题的
    }
   println!("i = {}",i);//此时i跳出了x的作用域,IDE会报生命周期不够长的错误
}

在这里插入图片描述
2.手动标注生命周期
示例:

fn main() 
{
    let s1 = "hello";
    let s2 = "helle world";
    println!("{}",contrast(s1, s2));
}

fn contrast(x: &str, y : &str) ->&str //对比x和y的长度并返回
{
    if(x.len() > y.len())
    {
        x
    }
    else 
    {
        y
    }
}

在这里插入图片描述
这里报错是因为返回类型的类型的生命周期不确定是来自x或者是y的,要手动标注生命周期,按提示进行手动标注生命周期:

fn main() 
{
    let s1 = "hello";
    let s2 = "helle world";
    println!("{}",contrast(s1, s2));
}

fn contrast<'a>(x: &'a str, y : &'a str) ->&'a str //这里手动标注了生命周期,就是返回类型的生命周期与x,y相同
{
    if(x.len() > y.len())
    {
        x
    }
    else 
    {
        y
    }
}

生命周期的语法:
以 ’ 开头,通常是全小写并且非常短,一般使用 'a,标注位置在引用&的后面,如:&'a T。

注:当指定了泛型生命周期参数,函数可以接收带有任何生命周期的引用,但生命周期的标注不会改变引用的生命周期长度,它只是描述了多个引用的生命周期间的关系,但不会影响引用的生命周期。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知来者逆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值