1

我的测试代码:

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

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

4

1 回答 1

4

您对范围和生命周期如何工作的理解是正确的。在 Rust 2018 版中,它们默认启用了非词法生命周期。在此之前,即使它的值在此之前被移动,它的生命周期inc也会到当前词法范围的末尾(即块的末尾)。

如果您可以使用 Rust 1.31 或更高版本,那么只需在您的Cargo.toml:

[package]
edition = "2018"

如果您使用的是最新的 Rust,当您使用cargo new.


如果您不使用 Cargo,则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);
于 2019-03-21T16:45:34.547 回答