11. Rust 结构体成员函数的生命周期(lifetime)标记
首条: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上使用
一文掌握Rust编程中的生命周期.pdf
内容概要:这篇文章深入介绍了在Rust编程中的生命周期概念,强调了在Rust语言中每个引用都有其生命周期,即引用在程序执行过程中具有自身的作用域,一旦超出作用域范围,其生命周期也随之结束,值变得无效。文章通过解释生命周期的概念和重要性,帮助读者更好地理解和应用Rust编程中的引用和生命周期管理。 适用人群:适合对Rust编程语言有一定了解的开发者、学习者以及对系统级编程和内存管理感兴趣的人群。无论是初学者还是有一定Rust编程经验的用户,都可以从本文中深入了解Rust中的生命周期概念及其应用。 使用场景及目标:可用于系统级编程、并发编程、内存安全等场景。通过学习Rust编程中的生命周期概念,读者可以提高对内存管理和引用生命周期的理解,编写更安全、高效的Rust程序,避免内存泄漏和悬空引用等问题。 其他说明:建议读者在阅读文章的同时结合实际代码示例进行练习和实践,加深对Rust生命周期的理解和掌握。生命周期管理是Rust语言的重要特性之一,对于编写高质量、安全的代码至关重要。通过掌握Rust中生命周期的概念和应用,读者可以提升编程技能,编写更可靠的Rust程序。祝愿读者通过本文学习
使用pybind11封装C++结构体作为参数的函数实现步骤
主要介绍了用pybind11封装C++结构体作为参数的函数实现步骤,本文分步骤通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
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
rust_type_list
rust_type_list



