20|生命周期:Rust如何做基本的生命周期符号标注?
唐刚
你好,我是 Mike,今天我们来了解一下 Rust 中的生命周期到底是什么。
你可能在互联网上的各种资料里早就见到过这个概念了,生命周期可以说是 Rust 语言里最难理解的概念之一,也是导致几乎所有人都觉得 Rust 很难,甚至很丑的原因。其实对于初学者来说,至少在开始的时候,它并不是必须掌握的,网上大量的资料并没有指明这一点,更加没有考虑到的是应该如何让初学者更加无痛地接受生命周期这个概念,而这也是我们这门课程尝试解决的问题。
下面让我们从一个示例说起,看看为什么生命周期的概念在 Rust 中是必要的。
从 URL 解析说起
URL 协议类似下面这个样子,可以粗略地将一个 URL 分割成 5 部分,分别是 protocol、host、path、query、fragment。
现在我们拿到一个 URL 字符串,比如就是图片里的这个。
现在要把它解析成 Rust 的结构体类型,按照我们已掌握的知识,先定义 URL 结构体模型,定义如下:
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
Rust生命周期符号标注在Rust语言中扮演着重要角色,有助于编译时分析。本文通过URL解析示例详细介绍了在Rust中如何使用生命周期符号标识结构体中的引用,以及引用的有效存在区间。同时,强调了Rust语言提供了最大的可能性,可以简单粗暴侧重于易用性,也可以从底层实现上做优化。此外,文章还介绍了Rust中的所有权和引用的生命周期分析,以及借用与引用、不可变引用、可变引用等相关概念。通过生动的示例和清晰的解释,帮助读者更好地理解了Rust中的生命周期概念及其在实际编程中的应用。总体而言,本文深入浅出地阐述了Rust生命周期符号标注的重要性和应用,对于想要深入了解Rust语言的读者具有很高的参考价值。文章还介绍了Rust中的所有权和引用的生命周期分析,以及借用与引用、不可变引用、可变引用等相关概念。通过生动的示例和清晰的解释,帮助读者更好地理解了Rust中的生命周期概念及其在实际编程中的应用。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 语言从入门到实战》,新⼈⾸单¥59
《Rust 语言从入门到实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(9)
- 最新
- 精选
- buoge下周可以实战了,好开心😁
作者回复: yeah
2023-12-10归属地:北京3 - seven9t"但对计算机来讲,每一条指令的执行,是要花相对确定的时间长度的,所以就在要执行的 CPU 指令条数和执行时间段上产生了正比映射关系。这就让我们在代码的编译期间去分析运行期间变量的生存时间区间变成可能。这就是 Rust 能够做生命周期分析的原因。" 静态分析和指令执行时间应该没关系,建议调整
作者回复: 你的建议不错。这段的意思其实是要说明指令序列的执行需要占用一段时间,以对应一段生命周期。具体描述上还可以优化一下,感谢🙏
2024-01-15归属地:广东1 - 伯阳Rust 牵涉面过于广泛,学习语言不是为了炫技,应该以实用为主,学以致用,边学边用。Rust 没有天花板,感觉学无止境,学习任何一项知识都是学以致用
作者回复: 对的
2023-12-04归属地:北京1 - asdf100在 “函数返回值中的引用” 这个示例中,是不是可以理解为 返回的值是s1, 但它的生命周期却是s2的生命周期,因此导致最后打印语句执行前, 由于 s2 生命周期原因被drop,而导致编译出错?
作者回复: 对的。
2023-12-07归属地:澳大利亚 - erikleerust编译器也在不断进化,实际上2021版就比2018版少了很多需要生命周期标注的场景,我相信随着rust编译器的进化,以后可能只有1%的场景需要用到生命周期标注
作者回复: 对的对的,是这样滴
2023-12-06归属地:北京 - PEtFiSh对于编译器来说,看到<>就是要干活的。<'a>可以理解为一种特殊的类型参数,编译器看到<>里的'a并不会对类型做展开,而是去检查并计算引用的生命周期。
作者回复: 可以类似理解,不过‘a不是类型,准确术语叫 generic lifetime parameter
2023-12-05归属地:四川 - Geek_e72251还没到实战就已经63%的进度了😭实战内容不会很少吧。希望能够有怎么debug的教学。
作者回复: 哈哈,这个课程之后我还会持续输出的,可以关注这方面的内容。rust领域太广泛了,值得研究一辈子
2023-12-04归属地:广东 - -struct A { foo: String, } impl A { fn play<'a>(&'a self, a: &'a str, b: &str) -> &str { a } } 返回a的时候只需要标注a参数,而返回b的时候只需要标准b参数,这里进一步说明了类型标注只关注传入传出
作者回复: 自己动手做实验得来的知识,真棒👍
2023-12-04归属地:北京 - 伯阳Rust 牵涉面过于广泛,学习语言不是为了炫技,应该以实用为主,学以致用,边学边用。Rust 没有天花板2023-12-04归属地:北京
收起评论