rust 为什么指定生存期会让我返回引用?[duplicate]

am46iovg  于 2023-03-02  发布在  其他
关注(0)|答案(1)|浏览(105)
    • 此问题在此处已有答案**:

Why can I return a reference to a local literal but not a variable?(1个答案)
2天前关闭。
我很难理解生命周期,我理解(我认为)用输入参数指定一个生命周期(例如foo〈'a〉(x:&'a String)-〉&'a String {})意味着返回的值继承了输入参数的生存期,因此将与输入参数的生存期一样长。然而,下面的代码在没有任何输入参数的情况下也能很好地编译,所以我不明白编译器是如何知道我希望Dragon::Green的引用生存足够长的时间以离开作用域的。是所有权被移到了更高的作用域,还是发生了其他事情?

fn main() {
  let d;

  {
    let dtile = testtile();
    d = dtile;
  }
  
  println!("{:?}", d);
}

#[derive(PartialOrd, Ord, PartialEq, Eq, Debug)]
enum Dragon {
    White,
    Green,
    Red
}

fn testtile<'a>() -> &'a Dragon {
    &Dragon::Green
}
ecbunoof

ecbunoof1#

用输入参数指定生存期(即foo ′ a〉(x:&'a String)-〉&' a String {})表示返回值继承输入参数的生存期
不完全是。生存期说明符是描述性的,而不是规定性的。
它们帮助“借款检查员”在生命周期内执行规则。
每个引用都有一个生存期,但是有时候你需要用名字来引用那个生存期,这就是生存期说明符的作用。
在您的示例中,借入检查器发现testtile返回的引用必须与变量d一样长,然后它尝试找到一个 concrete 生命周期来替换泛型生命周期参数'a,以使其正常工作。
在这种情况下,这确实有效,例如,如果我们指定引用的生存期为'static,就没有问题,而且假定一个简单的枚举变量实际上只是一个常量,这里也没有问题。
在更复杂的情况下,可能没有有效的方法来找到一个生存期来代替lifetime参数,尽管这种情况在Dragon结构体本身 * 包含 * 引用的情况下会更常见。

相关问题