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

幻灰龙 2021-08-16 23:20:57

首条:Rust 所有权(Ownership)  上一条:结构体成员的生命周期(lifetime)标记(lifetime)标记  下一条:未完待续

结构体成员函数和普通函数一样,可以有生命周期标识

struct Range{
    start: usize,
    len: usize    
}

impl Range{
    // 接受一个外部的Vec对象的借用作为参数
    // 返回这个Vec的片段的一个借用
    // 因此,需要引入生命周期标识
    // 表明返回的&[u8]的生命周期和传入的owner的生命周期一致
    pub fn as_slice<'a>(&self, owner: &'a Vec<u8>)->&'a [u8] {
        let slice = &owner[self.start..self.end()];
        slice
    }
}

下面的代码会出错:

enum AdvancedPiece{
    Range(Range),
    Vec(Vec<u8>)
}

impl AdvancedPiece{
    pub fn as_slice<'a>(&self, owner: & 'a Vec<u8>)->&'a [u8] {
        match self {
            AdvancedPiece::Range(range)=>{
                // range.as_slice(owner)返回的&[u8]生命周期和owner一致,用'a标记
                range.as_slice(owner) 
            },
            AdvancedPiece::Vec(vec)=> {
                // compile error: &vec的生命周期和owner并不一致
                &vec 
            }
        }
    }
}

结构体生命周期标识的一个需要注意的地方是,&self也是可以标注生命周期的,因为&self本身也是一个借用,既然是借用,就可以标记生命周期。从这个角度也可以进一步理解,生命周期就是标记借用对象的存活作用域用的。上述代码,实际上等价于:

enum AdvancedPiece{
    Range(Range),
    Vec(Vec<u8>)
}

impl AdvancedPiece{
    // self有自己独立的生命周期,用独立的生命周期标识'b 标记出来
    // 这样就看得更清楚了
    pub fn as_slice<'a,'b>(&'b self, owner: & 'a Vec<u8>)->&'a [u8] {
        match self {
            AdvancedPiece::Range(range)=>{
                // range.as_slice(owner)返回的&[u8]生命周期和owner一致,用'a标记
                range.as_slice(owner) 
            },
            AdvancedPiece::Vec(vec)=> {
                // compile error: &vec的生命周期是'b , 返回值需要的是'a
                &vec 
            }
        }
    }
}

因此,我们可以标记&self和owner的生命周期是一致的来向编译器说明需求:

enum AdvancedPiece{
    Range(Range),
    Vec(Vec<u8>)
}

impl AdvancedPiece{
    // 约定调用as_slice在self和owner的生命周期交集'a内是合法的
    pub fn as_slice<'a>(&'a self, owner: & 'a Vec<u8>)->&'a [u8] {
        match self {
            AdvancedPiece::Range(range)=>{
                // range.as_slice(owner)返回的&[u8]生命周期和owner一致,用'a标记
                range.as_slice(owner) 
            },
            AdvancedPiece::Vec(vec)=> {
                &vec // 此时,&vec的生命周期也是'a
            }
        }
    }
}
...全文
3015 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
幻灰龙 2021-10-08
精选
  • 打赏
  • 举报
回复

测试换行
测试换行

幻灰龙 2023-03-17
  • 打赏
  • 举报
回复
Rust在AI时代会有更大作用
CSDN-Ada助手 助教 2023-03-17
  • 打赏
  • 举报
回复
测试评论yyyy
幻灰龙 2023-03-17
  • 打赏
  • 举报
回复
测试评论yyyy
幻灰龙 2022-06-01
  • 打赏
  • 举报
回复

测试快来哦

幻灰龙 2021-10-08
  • 打赏
  • 举报
回复

测试换行

空格

1,725

社区成员

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

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