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

为何无所有者的变量仍可使用?Rust代码所有权疑问

为什么这段Rust代码能正常运行?

你的代码能正常运行,核心是Rust的临时值生命周期延长规则,以及对unwrap()调用逻辑的误解,拆解如下:

  • unwrap()确实获取了a的所有权
    Option::unwrap的签名是fn unwrap(self) -> T,调用它会消耗掉Option实例(也就是a),返回内部的Vec<i32>。这一步之后,a确实不再拥有原来的Some(vec![1,2,3]),a本身也会被标记为已消耗,无法再被使用。

  • 临时Vec的生命周期被延长
    执行let b = &a.unwrap();时,a.unwrap()返回的Vec<i32>是一个临时值。根据Rust的规则,若对临时值直接取引用且该引用被绑定到变量上,这个临时值的生命周期会被延长,与引用的生命周期保持一致——直到b离开当前作用域(main函数结束前)。

  • 谁是Vec的所有者?
    这个临时的Vec由编译器负责管理,它的所有权属于当前作用域的临时值存储区,直到b失效后才会被自动丢弃。你无需手动管理它的所有权,编译器会确保它在引用b存活期间始终存在。

可以通过以下代码验证a已被消耗:

fn main() {
    let a = Some(vec![1, 2, 3]);

    let b = &a.unwrap();
    dbg!(b);
    
    // 取消注释会编译报错:value used here after move
    // dbg!(a);
}

内容的提问来源于stack exchange,提问作者Antosser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:00:30