Rust生命周期约束'a: 'b下,传入短生命周期参数为何可行?
Rust生命周期约束
'a: 'b调用疑问解答 先看代码示例:
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); };
核心原因是Rust在调用函数时会自动推导满足约束的生命周期,不会严格绑定传入变量的原始生命周期。
具体拆解:
- 函数
f的约束'a: 'b要求'a的生命周期长于或等于'b,但调用时传入的short_lifetime(短生命周期)和long_lifetime(长生命周期),Rust不会直接把'a绑定到short_lifetime的原始周期、'b绑定到long_lifetime的原始周期——这显然不满足约束。 - 实际上,Rust会推导一个更短的共同生命周期:也就是
short_lifetime的生命周期长度。此时:- 把推导后的这个短生命周期同时作为
'a和'b,自然满足'a: 'b(自身等于自身); long_lifetime的原始生命周期比这个推导后的周期长,Rust允许长生命周期引用自动转换为短生命周期引用(这是引用协变性的特性),所以long_lifetime可以安全地被当作&'b i32传入。
- 把推导后的这个短生命周期同时作为
- 函数内部的赋值
y = x也完全合法:此时x的生命周期是推导后的短周期,y被重新赋值后同样是这个周期,返回的&'b i32也在short_var的作用域内有效,不会出现悬垂引用。
内容的提问来源于stack exchange,提问作者realwangliqiu
相关产品推荐
相关产品推荐

