【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

相关新闻

OpenClaw框架中的Self-Improving技能:AI Agent自主进化技术解析

OpenClaw框架中的Self-Improving技能:AI Agent自主进化技术解析

1. OpenClaw与Self-Improving技能概述OpenClaw作为新一代AI Agent开发框架,其核心价值在于提供了模块化的技能(Skill)体系。Self-Improving正是其中最引人注目的高级技能之一,它使AI Agent具备了持续进化的能力。不同于传统AI模型的静态表现,…

2026/7/23 18:51:42 阅读更多 →
FlexRay FIFO与消息处理机制深度解析:从双缓冲到实战配置

FlexRay FIFO与消息处理机制深度解析:从双缓冲到实战配置

1. 项目概述:为什么需要深入理解FlexRay的FIFO与消息处理? 在汽车电子和工业控制领域,当工程师们谈论高可靠性的实时通信时,FlexRay协议是一个绕不开的名字。它被设计用来满足下一代汽车网络对带宽、确定性和容错性的苛刻要求&…

2026/7/23 18:51:42 阅读更多 →
【Rust自学】10.6. 生命周期 Pt.2:生命周期的语法与例子

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

10.6 生命周期 Pt.2:生命周期的语法与例子 10.6.1. 生命周期标注语法 标注生命周期并不会改变引用存活多久。如果某个函数指定了泛型生命周期参数,那么它可以接收带有任何生命周期的引用。生命周期标注主要用于描述多个引用的生命周期之间的关系&#…

2026/7/23 18:51:42 阅读更多 →

最新新闻

供应链合同数字化:从成本中心到效率引擎的三大路径

供应链合同数字化:从成本中心到效率引擎的三大路径

在企业的合同管理体系中 传统纸质合同模式下,供应链合同的管理存在几个系统性问题:签署周期长拖慢采购节奏、合同版本混乱导致条款不一致、履约跟踪靠人工容易遗漏、发生纠纷时举证困难。这些问题单个看起来都不致命,但叠加在一起&#xff0c…

2026/7/23 19:04:46 阅读更多 →
faster-whisper 等语音转文字的python包,支持gpu和cpu模式

faster-whisper 等语音转文字的python包,支持gpu和cpu模式

一、先解决 faster-whisper 安装失败问题 1. 分开执行命令,不要一次性管道过滤,方便看完整报错 打开 CMD,依次执行: C:/Python/Python312/python.exe -m pip install --user faster-whisper如果网络超时/下载失败,换国…

2026/7/23 19:04:46 阅读更多 →
电子合同ROI深度解析:制造业年省142万,三年累计节省410万

电子合同ROI深度解析:制造业年省142万,三年累计节省410万

企业在评估是否引入电子合同时,第一个问题往往是"能省多少钱"。这个问题的答案并不简单——电子合同的成本节省不是单一维度的,而是贯穿合同生命周期的多个环节。本文以制造业为样本,构建一个可复用的成本测算框架,并结…

2026/7/23 19:04:46 阅读更多 →
frp内网穿透

frp内网穿透

frp内网穿透frp内网穿透参考文章FRP服务端配置步骤1. 准备工作2. 下载并安装FRP1.下载FRP2.解压文件3. 配置FRP服务端4. 配置阿里云安全组5. 启动 FRP 服务端6测试与验证FRP客户端服务端配置步骤windows配置其他token 生成frp内网穿透 参考文章 frp实现内网穿透(一…

2026/7/23 19:04:46 阅读更多 →
GEO优化AI搜索排名:本地化数字营销实战指南

GEO优化AI搜索排名:本地化数字营销实战指南

1. 项目背景与需求解析在上海闵行区开展GEO优化AI搜索排名业务,本质上是在解决企业本地化数字营销的核心痛点。这个需求背后反映的是当前企业获客渠道从传统线下向线上精准投放转移的大趋势。我接触过不少闵行区的制造型企业主,他们最常抱怨的就是&#…

2026/7/23 19:04:46 阅读更多 →
企业级AI Agent平台:客服、销售、IT、财务与理赔自动化实践

企业级AI Agent平台:客服、销售、IT、财务与理赔自动化实践

架构基座与调度机制 传统规则引擎面临维护成本过高问题。大语言模型赋予系统复杂推理能力。平台架构已突破单轮对话局限。多智能体协作成为企业标配。核心模块包含意图识别组件。向量记忆库提供跨会话支撑。工具层打通外部异构系统。决策中枢负责任务拆解。数据流向制约响应延迟…

2026/7/23 19:03:46 阅读更多 →

日新闻

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

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

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

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
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:01:26 阅读更多 →

周新闻

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

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

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

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

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

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

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

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

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

2026/7/23 17:49:47 阅读更多 →

月新闻