Rust生命周期

Rust生命周期

HPC vvvvvvvip

生命周期知识点

  1. 生命周期标记并不会改变任何引用的实际作用域。在通过函数签名指定生命周期参数时,我们并没有改变传入引用或返回真实引用的真实生命周期,而是告诉编译器当不满足此约束条件时,就拒绝编译通过。
  2. 不需要显式标注生命周期的三种规则
  • 每一个引用参数都会获得独自的生命周期
  • 若只有一个输入生命周期(函数参数中只有一个引用类型), 那么该生命周期会被赋给所有的输出生命周期
  • 若存在多个生命周期,且其中一个是&self&mut self,则&self的生命周期被赋给所有的输出生命周期

NLL(Non-Lexical Lifetime)

引用的生命周期正常来说应该从借用开始一直持续到作用域结束。但在1.31版本后,引用的生命周期从借用处开始,一直持续到最后一次使用的地方。

再借用

1
2
3
4
5
6
7
8
9
10
11
12
13
fn main() {
let mut p = Point { x: 0, y: 0 };
let r = &mut p;
// reborrow! 此时对`r`的再借用不会导致跟上面的借用冲突
let rr: &Point = &*r;

// 再借用`rr`最后一次使用发生在这里,在它的生命周期中,我们并没有使用原来的借用`r`,因此不会报错
println!("{:?}", rr);

// 再借用结束后,才去使用原来的借用`r`
r.move_to(10, 10);
println!("{:?}", r);
}

注意: 可变引用r和不可变引用rr同时存在不报错的原因是,rr并不是对p的不可变引用,而是对r的再借用,因此不会破会借用规则。 对于再借用,在rr的生命周期内,不能再使用原来的借用r

  • 标题: Rust生命周期
  • 作者: HPC
  • 创建于 : 2024-01-08 09:50:02
  • 更新于 : 2025-01-18 03:32:39
  • 链接: https://studyrecording.github.io/waste-code/2024/01/08/Rust生命周期/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论

未找到相关的 Issues 进行评论

请联系 @StudyRecording 初始化创建