gpt4 book ai didi

rust - 了解Rust中的引用生命周期

转载 作者:行者123 更新时间:2023-12-03 11:34:28 26 4
gpt4 key购买 nike

我是Rust的新用户,正在读一本书《完整的Rust编程引用指南》。书中有一个例子:

fn main() {
let mut a = String::from("testing");
let a_ref = &mut a;
a_ref.push('!');

println!("{}", a);
}

该书指出该代码将产生一个错误。

enter image description here

但是,在我的本地计算机上,我可以毫无问题地运行它。这是因为我使用的是较新的Rust编译器[ rustc 1.41.0-nightly (412f43ac5 2019-11-24)],而该代码在较旧的Rust上不起作用?我已经阅读了Rust官方书中的某些章节。据我了解,引用 a_ref的生存期在其最后一次使用即 a_ref.push('!');结束。那个 a_ref消失后,应该可以正确使用 a了。我的理解正确吗?

最佳答案

最有可能发生的情况是,您正在阅读的书正在教授生命,而忽略了非词汇生命。这是有道理的;词汇生命周期是最容易理解的。

运行以下命令将恢复到非词法生命周期出现之前的时间:

rustup default 1.30

这会将rustc还原到 1.31之前的版本,根据 this文档,这是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版)来遵循本书,也可以使用此经验法则来确定为什么它不按书进行编译,但可以与编译器一起使用今天提供: 如果编译器看到不再需要引用,则将删除该引用。在您的示例中,编译器看到此后不再需要 a_ref,因此它将在此之后插入一个隐式drop。请注意,这仅适用于引用,不适用于警戒,也不适用于涉及生命周期的更复杂的类型(特别是不能调用 drop代码的任何事物)。

关于rust - 了解Rust中的引用生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59206070/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com