无法理解Vector在Rust中的行为[重复]

问题描述 投票:3回答:1

这个问题在这里已有答案:

我正在读章Storing Lists of Values with Vectors。我正在尝试Attempting to add an element to a vector while holding a reference to an item的例子。

let mut _v: Vec<i32> = vec![2, 4, 6];
let _first = &_v[0];
_v.push(8);
println!("{:?}", _first);

根据预期的行为,它没有编译。根据这本书: -

当程序具有有效引用时,借用检查器会强制执行所有权和借用规则(在第4章中介绍),以确保此引用和对向量内容的任何其他引用仍然有效。回想一下规则,声明您不能在同一范围内拥有可变和不可变引用。该规则适用于清单8-7,其中我们持有对向量中第一个元素的不可变引用,并尝试向末尾添加元素,这将无效。

但如果我删除最后一个println语句,上面的代码将编译。我无法理解println!宏如何影响上述陈述。

如果我遗失任何东西,请告诉我。

rust
1个回答
8
投票

随着Non-Lexical Lifetimes(NLL)的引入,借用的寿命通常会缩短,如果它们不需要更长时间。如果您尝试在2015版Rust中编译没有println!的示例(据我所知,它没有NLL),则会出现编译错误(playground link)

即使使用NLL,print语句强制借用_v[0]至少持续到打印完成之后。但这意味着借款在可变借款_v.push(8)之前和之后开始。这是不可能发生的,因为可变借款必须是专属借款。

但是如果没有印刷声明,_v[0]的借款可以立即结束,允许可变借款发生。

© www.soinside.com 2019 - 2024. All rights reserved.