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