【Rust自学】10.6. 生命周期 Pt.2:生命周期的语法与例子

发布时间:2026/11/9 7:27:26

【Rust自学】10.6. 生命周期 Pt.2:生命周期的语法与例子 10.6 生命周期 Pt.2生命周期的语法与例子10.6.1. 生命周期标注语法标注生命周期并不会改变引用存活多久。如果某个函数指定了泛型生命周期参数那么它可以接收带有任何生命周期的引用。生命周期标注主要用于描述多个引用的生命周期之间的关系但它们本身并不影响生命周期。生命周期参数名必须以开头通常是全小写且非常短。很多开发者使用a作为生命周期参数名。生命周期标注放在符号后面并在标注与引用类型之间用空格隔开。10.6.2. 生命周期标注例子i32一个普通引用a i32带有显式生命周期的引用被引用的类型是i32a mut i32带有显式生命周期的可变引用单个生命周期标注本身没有意义。生命周期标注的目的是向 Rust 描述多个泛型生命周期之间的关系。以 10.5 生命周期 Pt.1生命周期的定义与意义、借用检查器与泛型生命周期 的代码为例fn main() { let string1 String::from(abcd); let string2 xyz; let result longest(string1.as_str(), string2); println!(The longest string is {result}); } fn longesta(x: a str, y: a str) - a str { if x.len() y.len() { x } else { y } }longest中参数x、参数y以及返回值的生命周期都是a这意味着x、y和返回值必须拥有“相同”的生命周期。从上面的例子也可以看出在函数签名中使用生命周期标注时必须把泛型生命周期参数声明在里。这个签名告诉 Rust存在一个生命周期a并且x、y和返回值必须至少活得和a一样长。因为生命周期标注主要用于描述多个引用的生命周期之间的关系但它们本身并不影响生命周期所以这样写并不会改变实参的生命周期。它只是给借用检查器提供了一些可用于检测非法调用的约束。因此longest函数并不需要知道x和y到底活多久它只需要某个作用域可以用来代替a同时满足函数签名的约束即可。当函数引用外部代码或被外部代码引用时几乎不可能单靠 Rust 编译器确定参数和返回值的生命周期。这样的函数所使用的生命周期可能在每次调用时都会变化。这正是有时需要手动标注生命周期的原因。在示例代码中当我们把具体引用传入longest函数时用来代替a的作用域是哪一块呢就是x和y作用域的重叠部分换句话说是两者中较短的那个生命周期。又因为返回值也有生命周期a所以返回的引用在x和y作用域的重叠部分中保持有效。这就是为什么在 10.5 生命周期 Pt.1生命周期的定义与意义、借用检查器与泛型生命周期 以及本文前面都把“相同”一词放在引号里它并不是字面意义上完全相同的生命周期而是指重叠的部分。接下来看看生命周期标注如何约束对longest的调用。如果我们修改上面的例子让string1有不同的作用域并把string2改成String会发生什么fn main() { let string1 String::from(abcd); { let string2 String::from(xyz); let result longest(string1.as_str(), string2.as_str()); println!(The longest string is {result}); } } fn longesta(x: a str, y: a str) - a str { if x.len() y.len() { x } else { y } }这里string1的作用域是从第 2 行到第 8 行string2的作用域是从第 4 行到第 7 行。把它们传入longest时函数会寻找重叠部分——或者说较短的那个生命周期——也就是string2的作用域从第 4 行到第 7 行。因此a所代表的作用域是从第 4 行到第 7 行。result在内部作用域中有效也就是直到第 7 行的结束花括号为止所以代码在a范围内仍然有效。如果我改的是result的作用域呢fn main() { let string1 String::from(abcd); let result; { let string2 String::from(xyz); result longest(string1.as_str(), string2.as_str()); } println!(The longest string is {result}); } fn longesta(x: a str, y: a str) - a str { if x.len() y.len() { x } else { y } }在这种情况下string1的作用域是从第 2 行到第 9 行string2的作用域是从第 5 行到第 7 行。把它们传入longest时函数会寻找重叠部分——或者说较短的那个生命周期——也就是string2的作用域从第 5 行到第 7 行。因此函数的泛型生命周期参数a指的是从第 5 行到第 7 行的作用域返回值也应该有同样的作用域。然而接收返回值的result变量实际从第 3 行活到第 9 行超出了a所代表的作用域所以程序会报错error[E0597]: string2 does not live long enough -- src/main.rs:6:44 | 5 | let string2 String::from(xyz); | ------- binding string2 declared here 6 | result longest(string1.as_str(), string2.as_str()); | ^^^^^^^ borrowed value does not live long enough 7 | } | - string2 dropped here while still borrowed 8 | println!(The longest string is {result}); | ------ borrow later used here编译器说string2活得不够长。为了保证第 8 行打印的result有效string2必须一直保持有效直到外部作用域结束。因为函数参数和返回值使用了相同的生命周期Rust 才能指出这个问题。让我们再重复一遍本文最重要的一点a所代表的实际生命周期是x和y两个生命周期中较短的那个。
延伸阅读

更多相关文章

2026/11/6 8:03:36

手把手教你搞定研0第一次组会

家人们,研0第一次组会是不是紧张到抠手?怕文献读不对,PPT做不好,一开口就挨批?我当时也是。后来回头想,组会其实没那么可怕,只是因为没人提前告诉我该准备什么。今天就手把手教你搞定研0第一次组…

2026/11/7 1:48:31

【Rust自学】11.1. 编写和运行测试

11.1 编写和运行测试 11.1.1. 什么是测试 在Rust里,测试就是一个函数,用于验证非测试代码的行为是否符合预期。 一个测试函数通常执行三个操作: - 准备(Arrange)数据/状态 - 运行(Act)被测试的代码 - 断言(Assert)结果 这三个操作在有些语…

2026/11/8 6:30:32

【Rust自学】11.2. 断言(Assert)

11.2 断言(Assert) 11.2.1. 使用assert!宏检查测试结果 assert!宏来自标准库,用于判断某个条件是否为true。它接收一个返回类型为布尔值的表达式: - 当assert!内的值为true时,测试通过,assert!也不会做多余的操作。 - 当assert!…

2026/11/9 7:23:43

特种工档案都需要什么值不值得考

特种工档案都需要什么值不值得考 之前考的证在外省能不能转过来?这几乎是所有特种作业人员最关心的问题之一。尤其是像你这样已经在外地考了证,想回老家发展,又担心证书不被认可的,心里肯定打鼓。今天咱们就来聊清楚【特种工档案都需要什么】,顺便也帮你…

2026/11/9 7:23:43

汉川哪里有考电工证怎么报名别怕交了培训费考不过

汉川哪里有考电工证怎么报名别怕交了培训费考不过 怕考不过白交培训费?汉川哪里有考电工证怎么报名?别急,看完这篇,你就能轻松搞定!特种作业证考试不是走个形式,它关系到你以后的执业资格和安全责任。很多学员一上来就问“汉川哪里有考电工证”,其实更…

2026/11/9 7:23:43

江门电工证怎么办保姆级教程:外省证能不能转过来,看完你就明白了

江门电工证怎么办保姆级教程:外省证能不能转过来,看完你就明白了 之前考的证在外省能不能转过来?这几乎是每个准备考电工证或已经在外地考了证的人员最关心的问题。今天就从【江门电工证怎么办】这个角度,手把手教你怎么操作,外省证能不能转,能不能用,…

2026/11/9 7:23:43

漠河市电工证是真的吗网上查询学历不高也能报

漠河市电工证是真的吗网上查询学历不高也能报 你是不是也担心学历不高,报不了漠河市电工证?其实不是的,现在越来越多的政策开始向基层技能人才倾斜,只要你符合条件,不管学历高低,都可以报考。而且,这个证在 网上查询…

2026/11/9 7:18:43

彭水电工证通过率揭秘:学历不高怕报不上名?这样备考稳过!

彭水电工证通过率揭秘:学历不高怕报不上名?这样备考稳过! 你是不是也觉得,学历不高就考不了电工证?其实不然,彭水电工证的报考门槛并没有你想象中那么高。只要你具备一定的实践经验,通过系统复习和高效备考,完全有可能一次通过考试。今天我们就来聊聊…

2026/11/9 0:37:55

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/9 0:03:09

建设厅的特种工有哪些含金量高?别交完钱考不过

建设厅的特种工有哪些含金量高?别交完钱考不过 怕考不过白交培训费?别急,先搞清楚建设厅的特种工有哪些含金量高的证,再决定是不是值得投入时间和金钱。 建设厅的特种工证是建筑行业里最基础、也最实用的证书之一,涉及多个作业类别,每种证的 含金量…

2026/11/9 0:03:09

荆门市电工证报名怎么考才靠谱 全国通用证别交冤枉钱

荆门市电工证报名怎么考才靠谱 全国通用证别交冤枉钱 怕考不过白交培训费?荆门市电工证报名前必须知道这些避坑指南。别看网上一堆培训机构广告,真要报个电工证,很多人被坑得一塌糊涂。特别是那些打着“包过”旗号的,最后不是考试不过,就是证不是全国通…

2026/11/9 0:03:09

高空电工作业过程通过率揭秘:怎么选靠谱机构不被坑

高空电工作业过程通过率揭秘:怎么选靠谱机构不被坑 不知道去哪报名怕被中介坑?你不是一个人。现在特种作业证报名渠道五花八门,从线下培训机构到线上代理,真假难辨。尤其是像高空电工作业这类高风险、高门槛的作业类型,证书含金量和考试通过率直接影响你…

2026/11/9 6:30:27

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/7 14:50:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑