【Rust自学】10.5. 生命周期 Pt.1:生命周期的定义与意义、借用检查器与泛型生命周期
10.5 生命周期 Pt.1生命周期的定义与意义、借用检查器与泛型生命周期10.5.1. 什么是生命周期Rust 中的每个引用都有自己的生命周期。生命周期的作用是让引用保持有效换句话说它就是引用保持有效的作用域。在大多数情况下生命周期是隐式的、可推断的。如果引用的生命周期可能以不同方式相互关联就必须手动标注生命周期。生命周期可以说是 Rust 与其他语言相比最与众不同的特征因此非常难学。10.5.2. 生命周期的存在意义生命周期存在的主要目的是避免悬空引用。这个概念在 4.4. 引用与借用 中已经讨论过这里重复一下之前的解释在使用指针时非常容易触发一种叫做悬空指针Dangling Pointer的错误。其定义如下一个指针引用了内存中的某个地址而这块内存可能已经被释放并重新分配给其他人使用。如果你引用了某些数据Rust 编译器会保证在引用离开作用域之前数据不会离开作用域。这就是 Rust 确保悬空引用永远不会出现的方式。看这个例子fn main() { let r; { // 小花括号 let x 5; r x; } println!({}, r); }在这个例子中先声明了r但没有初始化。目的是让r存在于小花括号外见注释位置的作用域中。当然Rust 没有Null值所以在初始化之前不能使用r。在小花括号内声明了变量x并赋值为5。下一行把x的引用赋给了r。在那个小花括号作用域结束之后在外面打印了r。这段代码是无效的因为打印r时x已经走出作用域并被销毁了。所以r的值——也就是x所引用的内存地址——现在指向的是已经被释放的内存它所指向的数据也不再是x。这就造成了悬空引用因此编译器会报错。输出error[E0597]: x does not live long enough -- src/main.rs:5:7 | 4 | let x 5; | - binding x declared here 5 | r x; | ^^ borrowed value does not live long enough 6 | } | - x dropped here while still borrowed 7 | println!({}, r); | - borrow later used here报错信息说借用的值活得不够长。这是因为内部花括号作用域结束时x走出了作用域但r有更大的作用域并可以继续使用。为了保证程序安全此时任何基于r的操作都无法正确运行。Rust 通过借用检查器来检查代码是否合法。10.5.3. 借用检查器借用检查器通过比较作用域来判断所有借用是否合法。在上面的例子中借用检查器发现r是对x的引用但r的存活时间比x更长因此会报错。怎么解决这个问题呢很简单让x至少活得和r一样长。fn main() { let x 5; let r x; println!({}, r); }在这种情况下x从第 2 行活到第 5 行r从第 3 行活到第 5 行。因此x的生命周期完全覆盖了r的生命周期程序不会报错。10.5.4. 函数中的泛型生命周期看这个例子fn main() { let string1 String::from(abcd); let string2 xyz; let result longest(string1.as_str(), string2); println!(The longest string is {result}); } fn longest(x: str, y: str) - str { if x.len() y.len() { x } else { y } }string1是String而string2是字符串切片str。这两个值被传入longest函数string1需要先转换成str然后打印返回值。longest的逻辑是比较两个输入参数并返回较长的那个。输出error[E0106]: missing lifetime specifier -- src/main.rs:9:33 | 9 | fn longest(x: str, y: str) - str { | ---- ---- ^ expected named lifetime parameter | help: this functions return type contains a borrowed value, but the signature does not say whether it is borrowed from x or y help: consider introducing a named lifetime parameter | 9 | fn longesta(x: a str, y: a str) - a str { | 错误说缺少生命周期标注更具体地说是返回类型缺少生命周期参数。正如help文本所说函数的返回类型包含一个借用值但函数签名没有说明这个借用值来自x还是来自y。考虑引入一个命名生命周期参数。再看这个函数fn longest(x: str, y: str) - str { if x.len() y.len() { x } else { y } }很明显这个函数的返回值要么是x要么是y但无法预先知道是哪一个。如果只看这个函数本身两个输入参数x和y的具体生命周期也是未知的。所以与前面的例子不同我们无法通过比较作用域来判断返回的引用是否会一直有效。借用检查器也做不到因为它不知道返回类型的生命周期是与x绑定还是与y绑定。实际上即使返回值是固定的这样写仍然会报错fn longest(x: str, y: str) - str { x }输出error[E0106]: missing lifetime specifier -- src/main.rs:9:33 | 9 | fn longest(x: str, y: str) - str { | ---- ---- ^ expected named lifetime parameter | help: this functions return type contains a borrowed value, but the signature does not say whether it is borrowed from x or y help: consider introducing a named lifetime parameter | 9 | fn longesta(x: a str, y: a str) - a str { | 编译器仍然无法判断因为函数签名没有表达返回类型中的借用值来自哪里。所以这与函数体内的逻辑无关完全与函数签名有关。该怎么改呢可以按照报错信息中的建议来改 help: this functions return type contains a borrowed value, but the signature does not say whether it is borrowed from x or y help: consider introducing a named lifetime parameter | 9 | fn longesta(x: a str, y: a str) - a str { | 既然它让我们添加泛型生命周期参数我们就添加一个fn longesta(x: a str, y: a str) - a str { if x.len() y.len() { x } else { y } }a表示一个名为a的生命周期。x、y和返回类型都使用生命周期a这意味着x、y和返回值的生命周期是相同的。“相同”这个说法并不完全精确因为main中x和y对应值的实际生命周期其实略有不同。这一点我们会在 10.6 生命周期 Pt.2生命周期的语法与例子 中讨论。现在看完整代码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 } }输出The longest string is abcd

相关新闻

【Rust自学】7.5. use关键字 Pt.2 :重导入与换国内镜像源教程

【Rust自学】7.5. use关键字 Pt.2 :重导入与换国内镜像源教程

7.5 use关键字 Pt.2 :重导出与换国内镜像源教程 7.5.1. 使用pub use重新导出名称 使用use将路径导入作用域内后,该名称在词法作用域内是私有的。 以 7.4. use关键字 Pt.1:use的使用与as关键字 的代码为例: mod front_of_house…

2026/7/23 18:49:03阅读更多 →
硬件限制下的AI训练场景与优化方案

硬件限制下的AI训练场景与优化方案

一、先明确你的硬件核心限制 配置:i7-4710MQ(4 核 8 线程)+16G DDR3+GTX960M 4G 移动端显存 致命瓶颈:仅 4G 独立显存,移动端 GPU 算力弱、CUDA 最高仅支持 10.2/11.1,新版 PyTorch 不兼容;全量训练极易 OOM 显存溢出。 仅能做小型模型从零训练、轻量大模型 LoRA 微调、…

2026/7/23 18:49:03阅读更多 →
金九银十Java面试1000问:基础/网络/算法/设计模式/多线程全覆盖,面试必刷

金九银十Java面试1000问:基础/网络/算法/设计模式/多线程全覆盖,面试必刷

本来已经在为去大厂工作摩拳擦掌的 Java 朋友,社招又是需要 5 年以上的,今年显得格外艰难: 就业人数高达 874 万!人才竞争加剧!大多数公司的招聘需求缩减!对社招来说,人才招聘要求愈来愈高&…

2026/7/23 18:49:03阅读更多 →
【CTF-WEN-PHP】phps查看源代码并用双重URL编码绕过,admin编码为%25%36%31%25%36%34%25%36%44%25%36%39%25%36%45

【CTF-WEN-PHP】phps查看源代码并用双重URL编码绕过,admin编码为%25%36%31%25%36%34%25%36%44%25%36%39%25%36%45

题目 攻防世界-WEB-PHP2 https://adworld.xctf.org.cn/challenges/list 解题 访问网址 http://61.147.171.105:64825/index.phps admin.split().map(c > % c.charCodeAt(0).toString(16).toUpperCase()).join()%61%64%6D%69%6E%61%64%6D%69%6E.split().map(c > % …

2026/7/23 19:59:27阅读更多 →
告别低效记录!免费又好用的语音转文字软件深度评测,准确率高达98.7%

告别低效记录!免费又好用的语音转文字软件深度评测,准确率高达98.7%

你是否也曾在冗长的会议后,面对堆积如山的录音文件感到头疼?是否在学生时代,为了一字不差地记下老师的板书和口述而手忙脚乱?又或者,作为一名内容创作者,需要将大量的视频、音频采访素材快速转化为文字&…

2026/7/23 19:59:27阅读更多 →
【CTF-MISC-压缩包】脚本实现批量提取压缩包数据

【CTF-MISC-压缩包】脚本实现批量提取压缩包数据

题目 2024年春秋杯网络安全联赛冬季赛 - MISC - 压力大,写个脚本吧 https://www.ichunqiu.com/battalion?t1&r78931 解题思路 打开文件 发现一个压缩包一个txt文件 txt里有一串密文 RkdGR0ZHRkdGR0ZHRkdGR0ZHRkdGR0ZHRkdGR0ZHRkdGR0ZHRkdGR0ZHRkdGR0ZH…

2026/7/23 19:59:27阅读更多 →
AI电商头花主图生成:Stable Diffusion商业实践

AI电商头花主图生成:Stable Diffusion商业实践

1. 项目背景与核心价值这个头花产品商业化做图项目源于一个很实际的需求:如何在电商平台上用最低成本批量生成高质量产品展示图。作为从业十年的电商视觉设计师,我深知中小商家在商品主图制作上的痛点——请专业摄影师拍摄成本高,自己拍又难以…

2026/7/23 19:59:27阅读更多 →
[具身智能-629]:从单人闭环到五人协同:云端GPU与边缘专用芯片AI开发的本质鸿沟

[具身智能-629]:从单人闭环到五人协同:云端GPU与边缘专用芯片AI开发的本质鸿沟

很多AI开发者都有一个直观困惑:为什么在电脑、云端随便就能跑通的模型,移植到边缘嵌入式芯片后,bug层出不穷、精度断崖下跌、帧率死活不达标?核心答案并非算力差距,而是两套完全不同的AI工程体系、两种截然不同的研发模…

2026/7/23 19:59:27阅读更多 →
RAG(03)——高质量文本分块

RAG(03)——高质量文本分块

为什么你的RAG效果不佳? 核心痛点 LLM强大,Prompt精心调校,但答案仍不准确检索算法和Embedding已优化,却忽略分块(Chunking) 关键结论 “不恰当的分块给模型喂’坏数据”分块质量决定RAG性能的下限 分块的本质 分块的必要性 LM上下文长度限制-向量检索对语义完整性的…

2026/7/23 19:57:21阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/23 0:56:31阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 0:56:31阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:00:28阅读更多 →
从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:28阅读更多 →
油泥处理设备哪里能买到

油泥处理设备哪里能买到

油泥处理设备哪里有?这是许多从事油田、炼化、清罐业务的从业者最关心的问题。根据河南三丰环保设备有限公司的行业经验,选购油泥处理设备的核心在于设备能否适配当地环保法规与原料特性,而非单纯看价格。该公司总经理王钦田先生指出&#xf…

2026/7/23 0:00:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/22 22:56:18阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/23 18:58:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/23 18:58:18阅读更多 →