You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:00:12