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

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

首条: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
            }
        }
    }
}
...全文

相关推荐

Rust的生命周期练习和讲解

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

CakeAL

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

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

27-1994

使用pybind11封装C++结构体作为参数的函数实现步骤

主要介绍了用pybind11封装C++结构体作为参数的函数实现步骤,本文分步骤通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

weixin_38677505

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
评论 6
收藏 已收藏
分享
返回顶部
幻灰龙
10x Rust 1,726 成员 130 内容