锈错误:掉落可变借位后发生借位

时间:2019-03-21 16:24:30

标签: rust lifetime borrow

我的测试代码:

let mut c = 0;
let mut inc = || { c += 1; c };
drop(inc);
println!("{}", c);

rustc说:

error[E0502]: cannot borrow `c` as immutable because it is also borrowed as mutable
  --> .\src\closure.rs:20:24
   |
12 |         let mut inc = || { c += 1; c };
   |                       --   ----- previous borrow occurs due to use of `c` in closure
   |                       |
   |                       mutable borrow occurs here
...
20 |         println!("{}", c);
   |                        ^^^^^ immutable borrow occurs here
21 |     }
   |     - mutable borrow ends here

但是inc是在println!借用c之前被手动删除的,不是吗?

那么我的代码有什么问题?请帮忙。

1 个答案:

答案 0 :(得分:4)

您对范围和生命周期的工作方式的理解是正确的。在Rust Edition 2018中,它们默认情况下启用了非词汇生存期。在此之前,inc的生存期将一直到当前词法作用域的末尾(即块的末尾),即使其值已移到该词法作用域之前。

如果您可以使用Rust版本1.31或更高版本,则只需在Cargo.toml中指定版本:

[package]
edition = "2018"

如果您使用的是最新的Rust,那么当您使用cargo new创建新的板条箱时,它将自动放置在此处。


如果您不使用货运,rustc默认为2015版,因此您需要明确提供该版本:

rustc --edition 2018 main.rs

如果由于某种原因您使用的是每晚更晚的Rust版本,则可以通过在主文件中添加以下内容来启用非词法生存期:

#![feature(nll)]

如果您使用的是较旧的发行版,通常可以使用如下代码块通过引入较短的作用域来解决这些错误:

let mut c = 0;
{
    let mut inc = || { c += 1; c };
    drop(inc);
    // scope of inc ends here
}
println!("{}", c);