为何无所有者的变量仍可使用?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
相关产品推荐
相关产品推荐

