Rust 声明周期简介

  1. {
  2. let r;
  3. {
  4. let x = 5;
  5. r = &x;
  6. }
  7. println!("r: {}", r);
  8. }

这段代码是不会通过 Rust 编译器的,原因是 r 在使用之前就被释放了。
image.png
如上,’a 表示 r 的生命周期,’b 表示 x 的生命周期,引用必须在生命周期内才有效。

  1. fn longer(s1: &str, s2: &str) -> &str {
  2. if s2.len() > s1.len() {
  3. s2
  4. } else {
  5. s1
  6. }
  7. }

如上,声明了一个比较字符串长度大小的函数。根据 rust 的所有权原则,下面的代码在编译期会报错:

  1. fn main() {
  2. let r;
  3. {
  4. let s1 = "rust";
  5. let s2 = "ecmascript";
  6. r = longer(s1, s2);
  7. }
  8. println!("{} is longer", r);
  9. }

所以此时需要根据生命周期注释来改造上述方法。

  1. fn longer<'a>(s1: &'a str, s2: &'a str) -> &'a str {
  2. if s2.len() > s1.len() {
  3. s2
  4. } else {
  5. s1
  6. }
  7. }