rust - 理解 Rust 中的引用生命周期
问题描述
我是 Rust 的新用户,我正在阅读《完整的 Rust 编程参考指南》一书。书中有一个例子:
fn main() {
let mut a = String::from("testing");
let a_ref = &mut a;
a_ref.push('!');
println!("{}", a);
}
该书指出代码将产生错误。
但是,在我的本地机器上,我可以毫无问题地运行它。这是因为我使用的是较新的 Rust 编译器 [ rustc 1.41.0-nightly (412f43ac5 2019-11-24)
] 并且代码不适用于较旧的编译器吗?我已经阅读了 Rust 官方书籍的一些章节。据我了解,引用的生命周期a_ref
在其最后一次使用时结束,即a_ref.push('!');
. 之后a_ref
就消失了,a
应该可以毫无问题地使用。我的理解正确吗?
解决方案
最有可能发生的情况是,您正在阅读的书正在教授生命周期,而忽略了非词汇生命周期。这是有道理的;词汇生命周期是最容易理解的。
运行以下命令将恢复到 non-lexical-lifetimes 出现之前:
rustup default 1.30
这会将 rustc 恢复到 version 之前1.31
,根据本文档,这是 nll 的最低版本。
运行它会导致完全相同的错误,如下所示:
> cargo run
Compiling forum_examples v0.1.0 (C:\Users\user\Desktop\forum_examples)
error[E0502]: cannot borrow `a` as immutable because it is also borrowed as mutable
--> src\main.rs:6:20
|
3 | let a_ref = &mut a;
| - mutable borrow occurs here
...
6 | println!("{}", a);
| ^ immutable borrow occurs here
7 | }
| - mutable borrow ends here
error: aborting due to previous error
For more information about this error, try `rustc --explain E0502`.
error: Could not compile `forum_examples`.
To learn more, run the command again with --verbose.
您可以选择使用此版本的编译器(或 2015 版的 1.35 版本)来严格按照本书进行操作,或者您可以使用此经验法则来确定为什么它不按照本书编译但使用编译器进行编译present today:如果编译器看到不再需要引用,它将删除它。在您的示例中,编译器认为a_ref
之后不再需要它,因此它会在此之后立即插入一个隐式删除。请注意,这仅适用于引用,而不适用于守卫或更复杂的涉及生命周期的类型(尤其是任何可以调用drop
代码的东西)。
推荐阅读
- node.js - 我无法使用 npm install 安装 bcrypt。我可以下载除 bcrypt 之外的所有其他软件包。为什么会这样?
- php - Yii2 Active Record 其中 % 模数
- javascript - 来自javascript复选框的PHP数组,限制
- r - 查找每列数据集列表的唯一级别
- javascript - 在 jMeter 中是否有特定的方法来执行字符串操作?
- algorithm - 您将如何在 Rete 网络中构建具有在其他规则中找到的两个条件的规则的 Alpha 节点?
- python - 如何在 Python 中计算给定百分位数内的平均值?
- python - 在 Kivy 中更新 RstDocument
- python - Python Matplotlib pyplot 直方图
- python - 谁能给我正确的理由,因为我预计分析器是 9 而结果是“0”?