rust eclipse 寿命限制

gg58donl  于 2023-03-08  发布在  Eclipse
关注(0)|答案(2)|浏览(116)
fn f<'a: 'b, 'b>(x: &'a i32, mut y: &'b i32) -> &'b i32 {
    y = x;  
      
    y
}

let long_var = 1;
let long_lifetime = &long_var;
{
    let short_var = 2;
    let short_lifetime = &short_var; 
    // it works, why?
    let x = f(short_lifetime, long_lifetime); 
};

函数f中有'a: 'b的限制,那么let x = f(short_lifetime, long_lifetime);为什么有效呢?

py49o6xq

py49o6xq1#

因为函数参数的生存期是 bounds, 不是严格的生存期,所以当你调用f(short_lifetime, long_lifetime)的时候,编译器试图找到生存期'a'b,使得:

  • short_lifetime的寿命 * 至少 * 与'a一样长(* 但是它可以寿命更长 *),
  • long_lifetime的寿命 * 至少 * 与'b一样长(* 但是它可以寿命更长 *),
  • 'a至少与'b一样长(但是它们可以相等),
  • 返回值的寿命 * 最多 * 与'b一样长(但它的寿命可能更短)。

一个可能的解决方案是取'a == 'b从函数调用到第一个结束}的持续时间,这符合所有上述约束(long_lifetime实际上比'b的寿命长,但这是允许的,因为寿命只是边界,而不是严格的)。

vuktfyat

vuktfyat2#

'a: 'b读取'aoutlives'b。因此,示例中的生存期颠倒过来,'a是长生存期,'b是短生存期。代码编译,因为您总是可以将引用从较长生存期强制转换为较短生存期(即,在您的情况下,将引用&'a强制转换为&'b)。请在参考中阅读更多信息

相关问题