Rust 锈蚀错误:删除可变借用后发生借用

Rust 锈蚀错误:删除可变借用后发生借用,rust,lifetime,borrow,Rust,Lifetime,Borrow,我的测试代码: 设mut c=0; 设mut inc=|{c+=1;c}; drop(公司); 普林顿!(“{}”,c); rustc说: error[E0502]:无法将'c'作为不可变项借用,因为它也是作为可变项借用的 -->.\src\closure.rs:20:24 | 12 |让mut inc=|{c+=1;c}; |----上一次借用是由于在闭包中使用了'c' | | |可变借用发生在这里 ... 20 | println!(“{}”,c

我的测试代码:

设mut c=0;
设mut inc=|{c+=1;c};
drop(公司);
普林顿!(“{}”,c);
rustc说:

error[E0502]:无法将'c'作为不可变项借用,因为它也是作为可变项借用的
-->.\src\closure.rs:20:24
|
12 |让mut inc=|{c+=1;c};
|----上一次借用是由于在闭包中使用了'c'
|                       |
|可变借用发生在这里
...
20 | println!(“{}”,c);
|^^^^^此处发生不可变借用
21 |     }
|-可变借用结束于此
但是
inc
println之前被手动删除借用
c
,不是吗


那么我的代码有什么问题?请提供帮助。

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

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

[软件包]
edition=“2018”
如果您使用的是最新的锈迹,当您使用
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);

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

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

[软件包]
edition=“2018”
如果您使用的是最新的锈迹,当您使用
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);

其他相关问题:,其他相关问题:,啊,对不起,我为这个问题创建了一个规范问题,希望你不介意。对不起,我为这个问题创建了一个规范问题,希望你不介意