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

幻灰龙 2021-08-11 11:44:56

上一条:函数参数上的生命周期(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--

...全文
3123 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 助教 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-编程语言 发布问题, 以便更快地解决您的疑问

1,725

社区成员

发帖
与我相关
我的任务
社区描述
Rust是新一代大规模底层系统平台开发的强力选项,拥有现代的类型系统,精确的生命周期控制,流畅的表达力和错误处理,以及明晰的异步编程范式。
rust 个人社区
社区管理员
  • 幻灰龙
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
社区主要目的: 1. 讨论Rust的核心语法语义 2. 讨论Rust的编程范式、最佳实践。 3. 讨论10x创新技术

试试用AI创作助手写篇文章吧