10. Rust 结构体成员的生命周期(lifetime)标记

幻灰龙 幻灰龙 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

上一条:函数参数上的生命周期(lifetime)标记  下一条:结构体成员函数的lifetime标记

 

首先,在Rust里面一个结构体的成员变量如果是一个外部对象的借用,那么必须标识这个借用对象的生命周期

 

struct Piece<'a>{
  slice:&'a [u8] // 表明slice是来自外部对象的一个借用,'a只是一个生命周期形参
}


Piece的定义里面,'a 表示vec的生命周期,
下面的例子调用,vec的生命周期至少应该大于等于piece的生命周期
简单说vec存活的作用域应该大于等于piece的存活作用域

fn test(){
  let vec = Vec::<u8>::new();
  let piece = Piece{slice: vec.as_slice()}; 
}

下面就是错的, piece返回后,vec已经挂了
不满足vec的生命周期大于等于piece的生命周期这条

fn test_2()->Piece{
  let vec = Vec::<u8>::new();
  let piece = Piece{slice: vec.as_slice()}; 
  piece // compile error: ^^^^^ returns a value referencing data owned by the current function
}

 

其次,如果有两个不同的成员,分别持有外部对象的借用,那么他们应该使用一个生命周期标识还是两个呢?

 

struct Piece<'a>{
  slice_1: &'a [u8],  // 使用相同的生命周期标识 
  slice_1: &'a [u8],  //
}

 

Piece的定义里面,'a只是表示slice_1和slice_2所借用的对象的存活范围在一个相同的作用域内,
而不是说slice_1和slice_2所借用的对象必须是同一个,区分这点很重要
 

fn test_1(){
  // slice_1 和 slice_2 借用了同一个对象vec
  let vec = Vec::<u8>::new();
  let piece = Piece{slice_1: vec.as_slice(), slice_2: vec.as_slice()}; 
}

fn test_2(){
  // slice_1 和 slice_2 借用了两个不同的对象
  let vec_1 = Vec::<u8>::new();
  let vec_2 = Vec::<u8>::new();
  let piece = Piece{slice_1: vec_1.as_slice(), slice_2: vec_2.as_slice()}; 
}

 

如果所借用的两个对象的存活返回不同,'a只会取他们生命周期的最小的交集
下面这个例子,'a 和 vec_1的作用域相同


 

fn test_3(vec_2:&Vec<u8>){
  // slice_1 和 slice_2 借用了两个不同的对象
  let vec_1 = Vec::<u8>::new();
  let piece = Piece{slice_1: vec_1.as_slice(), slice_2: vec_2.as_slice()}; 
}

 

因此,如果把piece返回就会出错,因为piece的生命周期不能超过vec_1


 

fn test_4(vec_2:&Vec<u8>)->Piece{
  // slice_1 和 slice_2 借用了两个不同的对象
  let vec_1 = Vec::<u8>::new();
  let piece = Piece{slice_1: vec_1.as_slice(), slice_2: vec_2.as_slice()}; 
  piece
  // compile error: ^^^^^ returns a value referencing data owned by the current function
}

 

显然,稍加改造就可以:
 

fn test_5<'a>(vec_1:&'a Vec<u8>, vec_2:&'a Vec<u8>)->Piece<'a>{
  // slice_1 和 slice_2 借用了两个不同的对象
  let piece = Piece{slice_1: vec_1.as_slice(), slice_2: vec_2.as_slice()}; 
  piece
}

 

--end--

...全文

相关推荐

Rust的生命周期练习和讲解

本资源主要讲解了Rust的生命周期标注,以及添加生命周期的方法 并介绍&' static生命周期的使用方法 并介绍Rust的生命周期如何在Trait Bound上使用

CakeAL

一文掌握Rust编程中的生命周期.pdf

内容概要:这篇文章深入介绍了在Rust编程中的生命周期概念,强调了在Rust语言中每个引用都有其生命周期,即引用在程序执行过程中具有自身的作用域,一旦超出作用域范围,其生命周期也随之结束,值变得无效。文章通过解释生命周期的概念和重要性,帮助读者更好地理解和应用Rust编程中的引用和生命周期管理。 适用人群:适合对Rust编程语言有一定了解的开发者、学习者以及对系统级编程和内存管理感兴趣的人群。无论是初学者还是有一定Rust编程经验的用户,都可以从本文中深入了解Rust中的生命周期概念及其应用。 使用场景及目标:可用于系统级编程、并发编程、内存安全等场景。通过学习Rust编程中的生命周期概念,读者可以提高对内存管理和引用生命周期的理解,编写更安全、高效的Rust程序,避免内存泄漏和悬空引用等问题。 其他说明:建议读者在阅读文章的同时结合实际代码示例进行练习和实践,加深对Rust生命周期的理解和掌握。生命周期管理是Rust语言的重要特性之一,对于编写高质量、安全的代码至关重要。通过掌握Rust中生命周期的概念和应用,读者可以提升编程技能,编写更可靠的Rust程序。祝愿读者通过本文学习

27-1994

Rust中的单元结构体:简洁之美

Rust是一种系统编程语言,专注于安全、并发性和性能。它由Mozilla研究院发起,由Graydon Hoare设计,并于2010年首次发布。Rust语言的设计目标是提供内存安全保障,同时保持C/C++级别的性能和控制能力。 Rust的主要特点包括: 1. **内存安全**:Rust通过所有权(Ownership)、借用(Borrowing)和生命周期(Lifetimes)的概念,在编译时防止数据竞争和使用后释放(use-after-free)等内存错误。 2. **无垃圾收集器**:Rust没有内置的垃圾收集机制,它使用所有权和生命周期系统来管理内存,从而避免运行时的内存管理开销。 3. **并发编程**:Rust的所有权和借用规则天然支持无锁并发编程,允许开发者编写既安全又高效的多线程代码。 4. **类型系统**:Rust拥有一个强大的类型系统,包括泛型、特性(Traits)、类型推断等,它们提供了代码复用和灵活性。 5. **模式匹配**:Rust提供了模式匹配,允许对数据结构进行复杂查询和变换。 6. **错误处理**:Rust使用`Result`和`Optio

liuxin33445566

rust_type_list

rust_type_list

Tristan Du

lifetime-variance-example:工作Rust示例演示差异

Rust的生命周期方差 这个工作示例涵盖了Rust的变异基础,因为它适用于生命周期,以素养的编程风格编写。 这是一个工作的Rust板条箱。 克隆此仓库并运行cargo build以与其一起玩。 转到开始! 执照

Friedrich ZHAO
评论 1
收藏 已收藏
分享
返回顶部
幻灰龙
10x Rust 1,726 成员 130 内容