Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 对锈蚀参考寿命的理解_Rust_Reference_Lifetime - Fatal编程技术网

Rust 对锈蚀参考寿命的理解

Rust 对锈蚀参考寿命的理解,rust,reference,lifetime,Rust,Reference,Lifetime,我是一个新的Rust用户,我正在读一本书《完整的Rust编程参考指南》。书中有一个例子: fn main(){ 让mut a=String::from(“测试”); 设a_ref=&mut a; a_ref.push(“!”); println!(“{}”,a); } 这本书声明代码将生成一个错误 但是,在我的本地机器上,我可以毫无问题地运行它。这是因为我使用的是更新的Rust编译器[rustc 1.41.0-nightly(412f43ac5 2019-11-24)],而代码在旧的编译器上

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

fn main(){
让mut a=String::from(“测试”);
设a_ref=&mut a;
a_ref.push(“!”);
println!(“{}”,a);
}
这本书声明代码将生成一个错误


但是,在我的本地机器上,我可以毫无问题地运行它。这是因为我使用的是更新的Rust编译器[
rustc 1.41.0-nightly(412f43ac5 2019-11-24)
],而代码在旧的编译器上不起作用?我读过官方锈书的一些章节。据我所知,引用
a_ref
的生命周期在其最后一次使用时结束,即
a_ref.push(“!”)。之后,
a_ref
不见了,
a
应该可以正常使用。我的理解正确吗?

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

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

rustup default 1.30
这将使rustc恢复到
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版)要完全按照这本书进行编译,或者您可以使用这条经验法则来确定为什么它没有按照这本书进行编译,而今天的编译器却这样做了:如果编译器发现不再需要它,它将删除一个引用。。在您的示例中,编译器看到以后不再需要
a_ref
,因此它在这之后插入了一个隐式drop。请注意,这只适用于引用,而不适用于保护或涉及生命周期的更复杂类型(尤其是不能调用
drop
code的任何类型)

最有可能的情况是,你正在读的书是在教授终身课程,而忽略了非词汇的终身课程。这是有道理的;词汇生命期是最容易理解的

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

rustup default 1.30
这将使rustc恢复到
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版)要完全按照这本书进行编译,或者您可以使用这条经验法则来确定为什么它没有按照这本书进行编译,而今天的编译器却这样做了:如果编译器发现不再需要它,它将删除一个引用。。在您的示例中,编译器看到以后不再需要
a_ref
,因此它在这之后插入了一个隐式drop。请注意,这只适用于引用,而不适用于保护或涉及生命周期的更复杂类型(尤其是不能调用
drop
code的任何类型)

这回答了你的问题吗?这回答了你的问题吗?