首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法理解锈菌中媒介的行为

无法理解锈菌中媒介的行为
EN

Stack Overflow用户
提问于 2019-04-17 03:46:23
回答 1查看 158关注 0票数 3

我在读用向量存储值列表章节。我试着用Attempting to add an element to a vector while holding a reference to an item这个例子。

代码语言:javascript
运行
复制
let mut _v: Vec<i32> = vec![2, 4, 6];
let _first = &_v[0];
_v.push(8);
println!("{:?}", _first);

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

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-17 04:24:38

随着非词汇寿命 (NLL)的引入,借款的寿命通常会缩短,如果它们不需要更长的时间。如果您试图在2015年版的Rust (据我所知没有NLL )中编译没有println!的示例,您将得到一个编译错误(游乐场连接)

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

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55719570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档