无法了解Vector In Rust的行为

时间:2019-04-17 03:46:24

标签: rust

我正在阅读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!宏如何影响上述声明。

如果我有任何遗漏,请让我知道。

1 个答案:

答案 0 :(得分:8)

随着Non-Lexical Lifetimes(NLL)的引入,如果不需要延长借贷期限,通常会缩短借贷期限。如果您尝试在2015版的Rust(据我所知没有NLL)中没有println!的情况下编译示例,则会出现编译错误(playground link)

即使使用NLL,打印语句也会强制_v[0]的借阅至少持续到打印完成之后。但这意味着借用在可变借用_v.push(8)之前开始,并在其后结束。因为可变借贷必须是专有借贷,所以不会发生这种情况。

但是如果没有打印声明,_v[0]的借用可能会立即结束,从而使可变借用发生。