10. Rust 结构体成员的生命周期(lifetime)标记
上一条:函数参数上的生命周期(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上使用
一文掌握Rust编程中的生命周期.pdf
内容概要:这篇文章深入介绍了在Rust编程中的生命周期概念,强调了在Rust语言中每个引用都有其生命周期,即引用在程序执行过程中具有自身的作用域,一旦超出作用域范围,其生命周期也随之结束,值变得无效。文章通过解释生命周期的概念和重要性,帮助读者更好地理解和应用Rust编程中的引用和生命周期管理。 适用人群:适合对Rust编程语言有一定了解的开发者、学习者以及对系统级编程和内存管理感兴趣的人群。无论是初学者还是有一定Rust编程经验的用户,都可以从本文中深入了解Rust中的生命周期概念及其应用。 使用场景及目标:可用于系统级编程、并发编程、内存安全等场景。通过学习Rust编程中的生命周期概念,读者可以提高对内存管理和引用生命周期的理解,编写更安全、高效的Rust程序,避免内存泄漏和悬空引用等问题。 其他说明:建议读者在阅读文章的同时结合实际代码示例进行练习和实践,加深对Rust生命周期的理解和掌握。生命周期管理是Rust语言的重要特性之一,对于编写高质量、安全的代码至关重要。通过掌握Rust中生命周期的概念和应用,读者可以提升编程技能,编写更可靠的Rust程序。祝愿读者通过本文学习
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
lifetime-variance-example:工作Rust示例演示差异
Rust的生命周期方差 这个工作示例涵盖了Rust的变异基础,因为它适用于生命周期,以素养的编程风格编写。 这是一个工作的Rust板条箱。 克隆此仓库并运行cargo build以与其一起玩。 转到开始! 执照



