当struct和它的成员具有不同的生命周期时,理解锈中的引用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当struct和它的成员具有不同的生命周期时,理解锈中的引用相关的知识,希望对你有一定的参考价值。

我正在玩lifetime生锈的复杂性,我最后编写了以下代码:

trait Boss<'a, 'c> {
  fn work(&self, &'a i32) -> &'c i32;
}

struct Human<'c> {
  i:&'c i32 
}

impl<'a, 'b, 'c> Boss<'a, 'c>  for &'b Human <'c> {
  fn work(&self, v:&'a i32) -> &'c i32 {
    &self.i
  }
}


fn main () {
  let h = Human {i:&1};
}

这段代码编译,但我不确定为什么。据我了解,&Human'b的寿命,而i的参考成员struct Human'c。为什么编译器不抱怨'b可以比'c更活跃?

答案

h : Human<'static>'static参考符合任何输出寿命要求。

尝试编写一些代码,其中h.i引用一个寿命比h短的变量。

fn main () {
    let mut h = Human {i:&1};
    {
        let x : i32 = 3;
        h.i = &x;
    }
    let r = (&h).work(&3);
}

error[E0597]: `x` does not live long enough
  --> a.rs:21:5
   |
20 |         h.i = &x;
   |                - borrow occurs here
21 |     }
   |     ^ `x` dropped here while still borrowed
22 |     let r = (&h).work(&3);
23 | }
   | - borrowed value needs to live until here

以上是关于当struct和它的成员具有不同的生命周期时,理解锈中的引用的主要内容,如果未能解决你的问题,请参考以下文章

CUDA:struct的共享数据成员和该struct的引用成员具有不同的地址,值

Laravel的生命周期

了解生命周期:最大生命周期和“静态”

具有不同生命周期的对象的 Scala 蛋糕模式

C语言中,哪种存储类的作用域与生命周期是不一致的?

activity生命周期