前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >5分钟总结Rust生命周期

5分钟总结Rust生命周期

作者头像
MikeLoveRust
发布2021-08-10 16:42:36
5210
发布2021-08-10 16:42:36
举报
文章被收录于专栏:Rust语言学习交流

lifetime 寿命

Rust中的每一个引用都有一个有效的作用域,生命周期就是为这个作用域服务的,大部分生命周期编译器可以推断出来,可以是隐式的。但是如果在某些情况下编译器就无法正常推断出来了,需要我们自己手动标注,标注生命周期语法就是'a这样的语法。

为什么需要生命周期?

例如下面例子就是在两个字符串切片里面查找最长的那个并且返回!

代码语言:javascript
复制
// 'a 是指3个引用的作用域生命周期要一致
fn find_long_str<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

上面我就加注了生命周期标识符,如果不加编译器会报错,原因是因为我们这个函数引用的是外部的变量,不能确定引用的变量是否已经被销毁了,那这样就是悬垂引用!

代码语言:javascript
复制
    let str1 = String::from("Hello");
    let str2;
    let result;
    {
        //let str2 = String::from(" World!");
        str2 = String::from(" World!");
        result = find_long_str(str1.as_str(), &str2);
    }
    // 这里借用检测就提示 引用了已经销毁的资源了
    println!("{}", result);

大致过程图

加了生命周期标识符之后,如果我把let str2 = String::from(" World!");取消注释放在一个内部作用域里面定义,那么这时调用find_long_str编译器就会报错,因为我在下面出了作用域还使用了find_long_str返回的结果,而这个结果可能就是str2的内容, 使用这个是违反了所有权规则的,str2离开内部作用域就被销毁了。

在标注生命周期fn find_long_str<'a>(x: &'a str, y: &'a str) -> &'a str之后编译器就知道输入参数和返回参数生命周期是要一致的,并且返回值生命周期肯定是取生命周期最短的那个的。

总结

  • 生命周期是确保被引用的值是有效的。
  • 引用的生命周期肯定是小于或者等于资源所有者的。
  • 如果是在函数里面创建的资源,应该是直接返回其所有权,而不是引用。
  • 每个生命周期标注都有不同的生命周期,如果有输入的生命周期,那么输出的生命周期也是一致的。
  • self的生命周期会被赋给输出的生命周期。

其他

  • 当然上面是我刚刚入坑总结话,有错误地方望大佬指教!
  • https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=a868aa030fa934b22cd770727f42724d
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rust语言学习交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • lifetime 寿命
  • 为什么需要生命周期?
  • 总结
  • 其他
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档