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);
为什么有效呢?
2条答案
按热度按时间py49o6xq1#
因为函数参数的生存期是 bounds, 不是严格的生存期,所以当你调用
f(short_lifetime, long_lifetime)
的时候,编译器试图找到生存期'a
和'b
,使得:short_lifetime
的寿命 * 至少 * 与'a
一样长(* 但是它可以寿命更长 *),long_lifetime
的寿命 * 至少 * 与'b
一样长(* 但是它可以寿命更长 *),'a
至少与'b
一样长(但是它们可以相等),'b
一样长(但它的寿命可能更短)。一个可能的解决方案是取
'a == 'b
从函数调用到第一个结束}
的持续时间,这符合所有上述约束(long_lifetime
实际上比'b
的寿命长,但这是允许的,因为寿命只是边界,而不是严格的)。vuktfyat2#
'a: 'b
读取'a
outlives'b
。因此,示例中的生存期颠倒过来,'a
是长生存期,'b
是短生存期。代码编译,因为您总是可以将引用从较长生存期强制转换为较短生存期(即,在您的情况下,将引用&'a
强制转换为&'b
)。请在参考中阅读更多信息