当前位置: 首页 > news >正文

西安注册公司网站黄页是什么东西

西安注册公司网站,黄页是什么东西,山东省水利建设市场信用信息平台网站,wordpress 微语Rust进阶[part3]_生命周期 生命周期概述 在Rust中,生命周期是一种确保引用有效性的机制。Rust编译器通过生命周期注解来跟踪引用的作用域,防止出现悬空引用(dangling references)。 简单使用 下面是一个简单的生命周期注解示例&am…

Rust进阶[part3]_生命周期

生命周期概述

在Rust中,生命周期是一种确保引用有效性的机制。Rust编译器通过生命周期注解来跟踪引用的作用域,防止出现悬空引用(dangling references)。

简单使用

下面是一个简单的生命周期注解示例:

fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {if x.len() > y.len() {x} else {y}
}fn main() {let string1 = String::from("abcd");let string2 = "xyz";let result = longest(&string1, string2);println!("The longest string is {}", result);
}

在这个例子中,'a 是一个生命周期参数,它表示 xy 引用的字符串切片必须至少和 'a 一样长。函数返回的引用也必须和 'a 一样长。

类别

fn

函数可以有生命周期参数,用于指定函数参数和返回值的生命周期关系。如上面的 longest 函数示例。

struct

结构体也可以包含引用类型的字段,这时需要为这些引用添加生命周期注解。

struct ImportantExcerpt<'a> {part: &'a str,
}fn main() {let novel = String::from("Call me Ishmael. Some years ago...");let first_sentence = novel.split('.').next().expect("Could not find a '.'");let i = ImportantExcerpt {part: first_sentence,};
}

这里的 'a 表示 part 字段引用的字符串切片必须至少和 ImportantExcerpt 实例一样长。

enum

枚举同样可以包含引用类型的字段,需要添加生命周期注解。

enum MaybeString<'a> {Some(&'a str),None,
}fn main() {let s = String::from("hello");let maybe_str = MaybeString::Some(&s);
}

生命周期消除

rust编译器自动推理,无需手动重复添加

  1. 每个引用参数都有自己的生命周期
  2. 如果只有一个输入引用参数,那么它的生命周期会被赋予所有输出引用
  3. 如果有多个输入生命周期参数,但是其中一个是 &self 或者 &mut self ,那它的生命周期也会被赋予所有输出引用 ,比如结构体和枚举自己实现的方法中

示例

fn first_word(s: &str) -> &str {let bytes = s.as_bytes();for (i, &item) in bytes.iter().enumerate() {if item == b' ' {return &s[0..i];}}&s[..]
}

在这个函数中,虽然没有显式地添加生命周期注解,但编译器根据生命周期消除规则,自动为 s 和返回值添加了相同的生命周期。

特殊生命周期的标注

全局变量或者字符串字面量的生命周期在整个程序运行期间都有效,一般是使用 'static 来标注的生命周期。

示例

let s: &'static str = "I have a static lifetime.";

这里的 s 是一个字符串字面量,它的生命周期是 'static,意味着它在整个程序运行期间都有效。

生命周期约束

生命周期注解可以用来约束多个引用之间的关系。

示例

fn longest_with_an_announcement<'a, T>(x: &'a str, y: &'a str, ann: T) -> &'a str
whereT: std::fmt::Display,
{println!("Announcement! {}", ann);if x.len() > y.len() {x} else {y}
}fn main() {let string1 = String::from("abcd");let string2 = "xyz";let ann = "Let's find the longest string!";let result = longest_with_an_announcement(&string1, string2, ann);println!("The longest string is {}", result);
}

在这个例子中,'a 约束了 xy 引用的字符串切片的生命周期,同时也约束了返回值的生命周期。

生命周期子类型和协变

生命周期可以有子类型关系,较短的生命周期可以被视为较长生命周期的子类型。这在协变(covariance)中尤为重要。

示例

fn main() {let r;{let x = 5;r = &x;} // x 在这里离开作用域,r 变成悬空引用println!("r: {}", r);
}

在这个例子中,x 的生命周期比 r 短,x 的生命周期是 r 生命周期的子类型。当 x 离开作用域时,r 变成悬空引用,这段代码会编译错误。

练习

要求:修复一下原始代码的bug

原始代码

fn test_lifetime_multiple() {fn insert_value<'a, 'b>(my_vec: &'a mut Vec<&'a i32>, value: &'b i32) {my_vec.push(value)}let mut my_vec: Vec<&i32> = vec![];let val1 = 1;let val2 = 2;let a = &mut my_vec;insert_value(a, &val1);println!("a is {:?} ", a);let b = &mut my_vec;insert_value(b, &val2);println!("b is {:?}", b);println!("{my_vec:?}");
}

修改后的代码

fn test_lifetime_multiple() {fn insert_value<'a, 'b>(my_vec: &'a mut Vec<&'b i32>, value: &'b i32) {my_vec.push(value)}let mut my_vec: Vec<&i32> = vec![];let val1 = 1;let val2 = 2;let a = &mut my_vec;insert_value(a, &val1);println!("a is {:?} ", a);let b = &mut my_vec;insert_value(b, &val2);println!("b is {:?}", b);println!("{my_vec:?}");
}

解释

分离生命周期参数

fn insert_value<'a, 'b>(my_vec: &'a mut Vec<&'b i32>, value: &'b i32)
  • 'amy_vec 可变引用的生命周期
  • 'b 是存储在 Vec 中的引用的生命周期
http://www.dtcms.com/a/597632.html

相关文章:

  • BFF 相关学习
  • 【SAA】SpringAI Alibaba学习笔记(三):ChatModel对话记忆存储和持久化
  • Excalidraw绘图软件
  • 苹果ios系统共享的ipa文件应用app签名怎么用?
  • 潍坊网站开发培训电影网站空间配置
  • 鸿蒙ef_crypto-加密组件-SM2Sync
  • windows 下的paddle ocr 部署
  • 融合之道:电科金仓数据库的“五化一体“革命
  • 微楼书网站建设全球推广
  • AR眼镜基于上下文智能识别:电力运维高效规范操作应用方案|阿法龙XR云平台
  • Linux 文件基本属性
  • 广州做外贸网站dw网页制作成品12页
  • 甘肃省两学一做专题网站哔哩哔哩网页入口
  • PostgreSQL 监控告警实战:从 “高并发卡顿才发现” 到 “提前 1 小时预警” 的守护指南
  • 利用影视网站做cpawordpress在线安装插件在哪里
  • Java 对象分配过程深度解析
  • Java 大视界 -- Java 大数据在智能医疗影像数据压缩与传输优化中的技术应用
  • Linux 系统安装与环境配置实践
  • 潍坊seo外包平台福州seo推广优化
  • C++ 图形中间件库Magnum详细介绍
  • 电商网站开发技术难点网页设计版式布局
  • 今日行情明日机会——20251111
  • 企业门户网站开发代码网站 制作软件
  • 网站建设合同书保密条款合肥网络公司平台
  • 深度学习(2)—— 神经网络与训练
  • Telnet
  • Spring MVC 中 @RequestMapping 路径映射与请求处理全流程
  • 住宅ip和机房ip有什么区别?IP地址冲突如何解决?
  • 更改备案网站名称网站已备案下一步怎么做
  • 网站大图怎么做更吸引客户免费视频素材软件app