【问题标题】:Not able to understand the behaviour of Vector In Rust [duplicate]无法理解 Rust 中 Vector 的行为 [重复]
【发布时间】:2019-09-07 05:30:15
【问题描述】:

我正在阅读章节 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! 宏如何影响上述语句。

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

【问题讨论】:

  • 变量名只能在不使用时加上下划线 (_),而您同时使用了vfirst

标签: rust


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 2019-08-21
    相关资源
    最近更新 更多