Rust 无法理解媒介在锈病中的行为

Rust 无法理解媒介在锈病中的行为,rust,Rust,我在读第二章。我尝试了一个示例,试图在保持对某个项的引用的同时将一个元素添加到向量中 let mut _v: Vec<i32> = vec![2, 4, 6]; let _first = &_v[0]; _v.push(8); println!("{:?}", _first); 让mut\u v:Vec=Vec![2, 4, 6]; 设_first=&u v[0]; _v、 推(8); 普林顿!(“{:?}”,_优先); 它没有按照预期的行为编译。书中说: 当程序具有有效

我在读第二章。我尝试了一个示例
,试图在保持对某个项的引用的同时将一个元素添加到向量中

let mut _v: Vec<i32> = vec![2, 4, 6];
let _first = &_v[0];
_v.push(8);
println!("{:?}", _first);
让mut\u v:Vec=Vec![2, 4, 6];
设_first=&u v[0];
_v、 推(8);
普林顿!(“{:?}”,_优先);
它没有按照预期的行为编译。书中说:

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

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

如果我遗漏了什么,请告诉我。

随着(NLL)的引入,借款的寿命通常会缩短,如果不需要更长的话。如果您试图编译示例而不使用
println
在2015版的Rust中(据我所知,它没有NLL),您会得到一个编译错误

即使使用NLL,print语句也会强制
\u v[0]
的借用至少持续到打印完成之后。但这意味着借用在可变借用之前开始,在可变借用之后结束。这不可能发生,因为可变借词必须是独占借词


但是如果没有print语句,
\u v[0]
的借用可以立即结束,从而允许可变借用发生。

变量名在不使用时只能以下划线(
\u
)作为前缀,但您同时使用了
v
优先